Пример #1
0
        private static IOrderedQueryable <TElement> InternalSort <TElement, TKey>(IOrderedQueryable <TElement> source, Expression <Func <TElement, TKey> > keySelector, SortingDirectionEnum direction)
        {
            var methodName = "ThenBy" + (direction == SortingDirectionEnum.Descending ? "Descending" : String.Empty);
            var unary      = (UnaryExpression)keySelector.Body;

            if (unary.NodeType != ExpressionType.Convert)
            {
                throw new ArgumentException("Wrong node type", nameof(keySelector));
            }

            var member     = (MemberExpression)unary.Operand;
            var memberType = member.Member.GetMemberType();
            var lambda     = Expression.Lambda(member, keySelector.Parameters);
            var sort       = Expression.Call(typeof(Queryable), methodName,
                                             new[] { source.ElementType, memberType },
                                             source.Expression, lambda);

            return((IOrderedQueryable <TElement>)source.Provider.CreateQuery <TElement>(sort));
        }
Пример #2
0
        public static IOrderedQueryable <TElement> ThenBy <TElement, TKey>(this IOrderedQueryable <TElement> source, Expression <Func <TElement, TKey> > keySelector, SortingDirectionEnum direction)
        {
            if (Reflector.Instance <TKey> .Type == Reflector.Instance <object> .Type)
            {
                return(InternalSort(source, keySelector, direction));
            }

            switch (direction)
            {
            case SortingDirectionEnum.Ascending:
                return(source.ThenBy(keySelector));

            case SortingDirectionEnum.Descending:
                return(source.ThenBy(keySelector));

            default:
                throw new ArgumentOutOfRangeException(nameof(direction));
            }
        }
Пример #3
0
        public static IOrderedQueryable <TElement> ThenBy <TElement>(this IOrderedQueryable <TElement> source, string propertyName, SortingDirectionEnum direction)
        {
            var keySelector = ExpressionExtensions.Create <TElement>(propertyName);

            return(ThenBy(source, keySelector, direction));
        }
Пример #4
0
        public static IOrderedQueryable <TElement> OrderBy <TElement, TKey>(this IQueryable <TElement> source, Expression <Func <TElement, TKey> > keySelector, SortingDirectionEnum direction)
        {
            switch (direction)
            {
            case SortingDirectionEnum.Ascending:
                return(source.OrderBy(keySelector));

            case SortingDirectionEnum.Descending:
                return(source.OrderByDescending(keySelector));

            default:
                throw new ArgumentOutOfRangeException(nameof(direction));
            }
        }