ParseOrdering() public method

public ParseOrdering ( ) : IEnumerable
return IEnumerable
        /// <summary>
        /// Sorts the elements of a sequence in ascending or decsending order according to a key.
        /// </summary>
        /// <param name="source">A sequence of values to order.</param>
        /// <param name="ordering">An expression string to indicate values to order by.</param>
        /// <param name="args">An object array that contains zero or more objects to insert into the predicate as parameters.  Similiar to the way String.Format formats strings.</param>
        /// <returns>A <see cref="IQueryable"/> whose elements are sorted according to the specified <paramref name="ordering"/>.</returns>
        /// <example>
        /// <code>
        /// var result = list.OrderBy("NumberProperty, StringProperty DESC");
        /// </code>
        /// </example>
        public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] args)
        {
            Validate.Argument(source, "source").IsNotNull().Check()
            .Argument(ordering, "ordering").IsNotNull().IsNotEmpty().IsNotWhiteSpace().Check();


            ParameterExpression[] parameters = new ParameterExpression[] {
                Expression.Parameter(source.ElementType, "")
            };
            ExpressionParser parser = new ExpressionParser(parameters, ordering, args);
            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, parameters)));
                methodAsc  = "ThenBy";
                methodDesc = "ThenByDescending";
            }
            return(source.Provider.CreateQuery(queryExpr));
        }
        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");
            }
            ParameterExpression[] parameters = new ParameterExpression[] {
                Expression.Parameter(source.ElementType, "")
            };
            ExpressionParser parser = new ExpressionParser(parameters, ordering, values);
            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, parameters)));
                methodAsc  = "ThenBy";
                methodDesc = "ThenByDescending";
            }
            return(source.Provider.CreateQuery(queryExpr));
        }
        /// <summary>
        /// Sorts the elements of a sequence in ascending or descending order according to a key.
        /// </summary>
        /// <param name="source">A sequence of values to order.</param>
        /// <param name="ordering">An expression string to indicate values to order by.</param>
        /// <param name="args">An object array that contains zero or more objects to insert into the predicate as parameters.  Similar to the way String.Format formats strings.</param>
        /// <returns>A <see cref="IQueryable"/> whose elements are sorted according to the specified <paramref name="ordering"/>.</returns>
        /// <example>
        /// <code>
        /// var result = list.OrderBy("NumberProperty, StringProperty DESC");
        /// </code>
        /// </example>
        public static IOrderedQueryable OrderBy(this IQueryable source, string ordering, params object[] args)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }
            if (string.IsNullOrEmpty(ordering?.Trim()))
            {
                throw new ArgumentNullException(nameof(ordering));                                         //string.IsNullOrWhiteSpace not available in NET35
            }
            ParameterExpression[] parameters = new ParameterExpression[] {
                Expression.Parameter(source.ElementType, "")
            };
            ExpressionParser parser = new ExpressionParser(parameters, ordering, args);
            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, parameters)));
                methodAsc  = "ThenBy";
                methodDesc = "ThenByDescending";
            }
            return((IOrderedQueryable)source.Provider.CreateQuery(queryExpr));
        }
Beispiel #4
0
        public static IQueryable <T> OrderBy <T>(this IQueryable <T> source, string ordering, params object[] values)
        {
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (ordering == null)
            {
                throw new ArgumentNullException("ordering");
            }
            var parameters = new[]
            {
                Expression.Parameter(source.ElementType, "")
            };

            var parser    = new ExpressionParser(parameters, ordering, values);
            var orderings = parser.ParseOrdering();

            object result = source;

            var helperMethodName = "OrderByHelper";

            foreach (var order in orderings)
            {
                var keySelectorExpression = Expression.Lambda(
                    order.Selector,
                    order.Parameter
                    );

                var orderByHelperMethod = typeof(DynamicQueryable)
                                          .GetMethod(helperMethodName, BindingFlags.NonPublic | BindingFlags.Static)
                                          .MakeGenericMethod(typeof(T), order.Selector.Type);

                result = orderByHelperMethod.Invoke(null, new object[] { result, keySelectorExpression, order.Ascending });

                helperMethodName = "ThenByHelper";
            }

            return((IOrderedQueryable <T>)result);
        }
Beispiel #5
0
        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");
            }
            ParameterExpression[] parameters = new ParameterExpression[]
            {
                Expression.Parameter(source.ElementType, "")
            };
            ExpressionParser expressionParser        = new ExpressionParser(parameters, ordering, values);
            IEnumerable <DynamicOrdering> enumerable = expressionParser.ParseOrdering();
            Expression expression = source.Expression;
            string     text       = "OrderBy";
            string     text2      = "OrderByDescending";

            foreach (DynamicOrdering current in enumerable)
            {
                expression = Expression.Call(typeof(Queryable), current.Ascending ? text : text2, new Type[]
                {
                    source.ElementType,
                    current.Selector.Type
                }, new Expression[]
                {
                    expression,
                    Expression.Quote(Expression.Lambda(current.Selector, parameters))
                });
                text  = "ThenBy";
                text2 = "ThenByDescending";
            }
            return(source.Provider.CreateQuery(expression));
        }
 public static IQueryable OrderBy(this IQueryable source, string ordering, QueryResolver queryResolver)
 {
     if (source == null)
         throw new ArgumentNullException("source");
     if (ordering == null)
         throw new ArgumentNullException("ordering");
     ParameterExpression[] parameters = new ParameterExpression[] {
         Expression.Parameter(source.ElementType, "") };
     ExpressionParser parser = new ExpressionParser(parameters, ordering, queryResolver);
     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(DynamicExpression.Lambda(o.Selector, parameters)));
         methodAsc = "ThenBy";
         methodDesc = "ThenByDescending";
     }
     return source.Provider.CreateQuery(queryExpr);
 }