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); }
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); }