Exemple #1
0
        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));
        }
Exemple #2
0
        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
                });
            }
        }