public static LambdaExpression BuildPredicate(this IEnumerable <FilterGroup> filterGroups, Type type, VariableResolver variableResolver = null, IEnumerable <string> validProperties = null, IDictionary <string, string> propertyMapping = null) { if (filterGroups == null) { throw new ArgumentNullException(nameof(filterGroups)); } if (type == null) { throw new ArgumentNullException(nameof(type)); } var arg = new BuildArgument { ValidProperties = validProperties, EvaluationType = type, VariableResolver = variableResolver, PropertyMapping = propertyMapping }; if (!IsValid(filterGroups, arg)) { throw new InvalidOperationException("The operator or property name is not valid"); } var allFilterGroups = filterGroups as FilterGroup[] ?? filterGroups.ToArray(); allFilterGroups = allFilterGroups.Where(p => p?.Filters?.Any() == true).ToArray(); if (!allFilterGroups.Any()) { return(FilterExtensions.AlwaysTruePredicate(type)); } var param = type.CreateParameterExpression(); var body = allFilterGroups.Aggregate((Expression)null, (current, next) => current == null ? FilterExtensions.BuildBody(next.Filters.ToArray(), param, arg) : Expression.OrElse(current, FilterExtensions.BuildBody(next.Filters.ToArray(), param, arg))); return(Expression.Lambda(body, param)); }
internal static EvaluationResult TryBuildPredicate(this IEnumerable <FilterGroup> filterGroups, Type type, BuildArgument arg) { if (!filterGroups.Any()) { return new EvaluationResult { Succeeded = true, Result = FilterExtensions.AlwaysTruePredicate(type) } } ; var allFilterGroups = filterGroups as FilterGroup[] ?? filterGroups.ToArray(); foreach (var filterGroup in allFilterGroups) { if (filterGroup is null) { throw new InvalidOperationException("FilterGroup can not be null"); } if (filterGroup.Filters is null) { throw new InvalidOperationException("Filters of FilterGroup can not be null"); } foreach (var filter in filterGroup.Filters) { arg.IsValidProperty(filter.Property); arg.IsValidOperator(filter.Operator); } } if (arg.InvalidOperators.Any() || arg.InvalidProperties.Any()) { return(new EvaluationResult { InvalidProperties = arg.InvalidProperties, InvalidOperators = arg.InvalidOperators }); } try { var param = type.CreateParameterExpression(); var body = allFilterGroups.Aggregate((Expression)null, (current, next) => current == null ? FilterExtensions.BuildBody(next.Filters.ToArray(), param, arg) : Expression.OrElse(current, FilterExtensions.BuildBody(next.Filters.ToArray(), param, arg))); return(new EvaluationResult { Succeeded = true, Result = Expression.Lambda(body, param) }); } catch (Exception ex) { return(new EvaluationResult { Exception = ex }); } }