/// <summary>
        /// Compile expression collection to query predicate.
        /// </summary>
        /// <param name="expressions"></param>
        /// <returns></returns>
        public LinqPredicate CompileQuery(QueryParameterExpressionCollection expressions)
        {
            if (expressions.Count == 0)
                return null;

            List<string> predicates = new List<string>();
            ArrayList parameters = new ArrayList();
            foreach (QueryParameterExpression exp in expressions)
            {
                QueryFieldOperators op = GetOperator(exp);
                string expressionString = AssemblyExpressionString(exp.FieldName, exp.Operator, exp.Value, parameters);
                predicates.Add(expressionString);
            }

            return new LinqPredicate(predicates.Concat(" AND "), parameters.ToArray());
        }
        /// <summary>
        /// Build <seealso cref="QueryParameterExpressionCollection"/> from collection of queryFieldConfigurations and posted values.
        /// </summary>
        /// <param name="queryFieldConfigurations"></param>
        /// <param name="postedValuesByControlIndex"></param>
        /// <returns></returns>
        public static QueryParameterExpressionCollection BuildQueryParameterExpressions(IEnumerable<QueryFieldConfiguration> queryFieldConfigurations, IEnumerable<KeyValuePair<int, string>> postedValuesByControlIndex)
        {
            QueryParameterExpressionCollection results = new QueryParameterExpressionCollection();
            IDictionary<int, QueryFieldConfiguration> queryFieldConfigurationByControlIndex = BuildQueryFieldConfiguration(queryFieldConfigurations);
            IControlValueResolverFactory controlValueResolverFactory = SpringContext.Current.GetObject<IControlValueResolverFactory>();
            foreach (KeyValuePair<int, string> postedVaule in postedValuesByControlIndex)
            {
                if (postedVaule.Key >= queryFieldConfigurationByControlIndex.Count)
                    throw new ValidationException(string.Format(CultureInfo.InvariantCulture, Resources.DPCtrl_PostedValueControlIndexInvalid, postedVaule.Key));

                QueryFieldConfiguration queryFieldConfiguration = queryFieldConfigurationByControlIndex[postedVaule.Key];
                object fieldValue = controlValueResolverFactory.Resolve(queryFieldConfiguration, postedVaule.Value);
                results.Add(new QueryParameterExpression(queryFieldConfiguration.FieldName, queryFieldConfiguration.Operator, fieldValue, queryFieldConfiguration));
            }

            return results;
        }