/// <summary> /// Creates a predicate filter expression combining <see cref="FilterDescriptors"/> /// expressions with <see cref="LogicalOperator"/>. /// </summary> /// <param name="parameterExpression">The parameter expression, which will be used for filtering.</param> /// <returns>A predicate filter expression.</returns> protected override Expression CreateFilterExpression(ParameterExpression parameterExpression) { var builder = new FilterDescriptorCollectionExpressionBuilder(parameterExpression, this.FilterDescriptors, this.LogicalOperator); builder.Options.CopyFrom(this.ExpressionBuilderOptions); return builder.CreateBodyExpression(); }
/// <summary> /// Filters a sequence of values based on a collection of <see cref="IFilterDescriptor"/>. /// </summary> /// <param name="source">The source.</param> /// <param name="filterDescriptors">The filter descriptors.</param> /// <returns> /// An <see cref="IQueryable" /> that contains elements from the input sequence /// that satisfy the conditions specified by each filter descriptor in <paramref name="filterDescriptors" />. /// </returns> public static IQueryable Where(this IQueryable source, IEnumerable<IFilterDescriptor> filterDescriptors) { if (filterDescriptors.Any()) { var parameterExpression = Expression.Parameter(source.ElementType, "item"); var expressionBuilder = new FilterDescriptorCollectionExpressionBuilder(parameterExpression, filterDescriptors); expressionBuilder.Options.LiftMemberAccessToNull = source.Provider.IsLinqToObjectsProvider(); var predicate = expressionBuilder.CreateFilterExpression(); return source.Where(predicate); } return source; }