Пример #1
0
        public static IEnumerable <TType> Create <TType>(
            IEnumerable <TType> collection,
            IList <SortingObject> ascendingSortings,
            IList <SortingObject> descendingSortings)
            where TType : class
        {
            Guard.Requires(ascendingSortings, "sortingSettings").IsNotNull();
            Guard.Requires(ascendingSortings, "sortingSettings").IsNotNull();

            itemParameter = Expression.Parameter(typeof(TType), "item");
            IOrderedEnumerable <TType> result = null;
            Expression propertyAccessor;

            if (ascendingSortings.Count > 0)
            {
                propertyAccessor = RecursivelyPropertyInfoGetter.CreatePropertyExpression(itemParameter, ascendingSortings[0].Prop);
                propertyAccessor = Expression.Convert(propertyAccessor, typeof(object));

                result = collection.OrderBy(Expression.Lambda <Func <TType, object> >(propertyAccessor, itemParameter).Compile());

                for (int i = 1; i < ascendingSortings.Count; i++)
                {
                    propertyAccessor = RecursivelyPropertyInfoGetter.CreatePropertyExpression(itemParameter, ascendingSortings[i].Prop);
                    result           = ApplySortExpressionAscending(result, propertyAccessor);
                }
            }

            if (descendingSortings.Count > 0)
            {
                propertyAccessor = RecursivelyPropertyInfoGetter.CreatePropertyExpression(itemParameter, descendingSortings[0].Prop);
                propertyAccessor = Expression.Convert(propertyAccessor, typeof(object));

                if (result == null)
                {
                    result = collection.OrderByDescending(Expression.Lambda <Func <TType, object> >(propertyAccessor, itemParameter).Compile());
                }
                else
                {
                    result = result.ThenByDescending(Expression.Lambda <Func <TType, object> >(propertyAccessor, itemParameter).Compile());
                }

                for (int i = 1; i < descendingSortings.Count; i++)
                {
                    propertyAccessor = RecursivelyPropertyInfoGetter.CreatePropertyExpression(itemParameter, descendingSortings[i].Prop);
                    result           = ApplySortExpressionDescending(result, propertyAccessor);
                }
            }

            return(result);
        }
Пример #2
0
        private static Expression ConcatenateAndOrExpressions(
            IEnumerable <Filter> filters,
            ParameterExpression itemParameter,
            Type filterableClassType)
        {
            Expression where = null;
            MemberExpression property;
            Expression       filterExpression;

            if (filters != null)
            {
                foreach (var filter in filters)
                {
                    property = RecursivelyPropertyInfoGetter.CreatePropertyExpression(itemParameter, filter.PropertyName);

                    filter.Value = ValueParser.ParseValueToPropertyType(property, filter.Value);

                    filterExpression = CompareExpressionByOperator(
                        filter.Operator,
                        property,
                        Expression.Constant(filter.Value));

                    if (filter.OrFilters != null && filter.OrFilters.Count > 0)
                    {
                        Expression filtersExpressions = ConcatenateAndOrExpressions(filter.OrFilters, itemParameter, filterableClassType);
                        if (filtersExpressions != null)
                        {
                            filterExpression = Expression.OrElse(filterExpression, filtersExpressions);
                        }
                    }

                    if (where != null)
                    {
                        where = Expression.AndAlso(where, filterExpression);
                    }
                    else
                    {
                        where = filterExpression;
                    }
                }
            }

            return(where);
        }