public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (ordering == null)
            {
                throw new ArgumentNullException("ordering");
            }

            var resolver = new MapIdentifierResolver();

            resolver.AddPositionalArguments(values);

            var parser = new ExpressionParser(ordering, resolver, source.ElementType);

            IEnumerable <DynamicOrdering> orderings = parser.ParseOrdering();
            Expression queryExpr  = source.Expression;
            string     methodAsc  = "OrderBy";
            string     methodDesc = "OrderByDescending";

            foreach (DynamicOrdering o in orderings)
            {
                queryExpr = Expression.Call(
                    typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
                    new Type[] { source.ElementType, o.Selector.Type },
                    queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parser.IteratorParameter)));
                methodAsc  = "ThenBy";
                methodDesc = "ThenByDescending";
            }
            return(source.Provider.CreateQuery(queryExpr));
        }
        public static LambdaExpression ParseLambda(Type itType, Type resultType, string expression, params object[] values)
        {
            var resolver = new MapIdentifierResolver();

            resolver.AddPositionalArguments(values);

            return(ParseLambda(itType, resultType, expression, resolver));
        }
        public static LambdaExpression ParseLambda(Type resultType, string expression, params object[] values)
        {
            var resolver = new MapIdentifierResolver();

            resolver.AddPositionalArguments(values);

            var parser = new ExpressionParser(expression, resolver);

            return(Expression.Lambda(parser.Parse(resultType)));
        }