Пример #1
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            if (methodCallExpression.Arguments[1].NodeType != ExpressionType.NewArrayInit)
            {
                return(null);
            }

            foreach (Expression part in ((NewArrayExpression)methodCallExpression.Arguments[1]).Expressions)
            {
                parameters.Add(predicateVisitorFactory.Create(part));
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(parent, collection);

            return(equal);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            var methodExpression =
                (MethodCallExpression)methodCallExpression.Arguments[1];

            if (Expression.Lambda(methodExpression).Compile().DynamicInvoke() is IEnumerable <object> arr)
            {
                foreach (var element in arr)
                {
                    parameters.Add(
                        new ConstantPredicateVisitor(element.ToString().WrapInQuotes()));
                }
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(parent, collection);

            return(equal);
        }
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression == null)
            {
                return(null);
            }

            string methodName = FilterMapping.AllowedGroupMethods[methodCallExpression.Method.Name];
            ConstantPredicateVisitor method     = new ConstantPredicateVisitor(methodName);
            IPredicateVisitor        parent     = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            List <IPredicateVisitor> parameters = new List <IPredicateVisitor>();

            if (methodCallExpression.Arguments[1].NodeType != ExpressionType.NewArrayInit)
            {
                return(null);
            }

            foreach (Expression part in ((NewArrayExpression)methodCallExpression.Arguments[1]).Expressions)
            {
                parameters.Add(predicateVisitorFactory.Create(part));
            }

            CollectionPredicateVisitor collection = new CollectionPredicateVisitor(parameters);
            EqualPredicateVisitor      equal      = new EqualPredicateVisitor(method, collection);

            Visitors.AccessorPredicateVisitor accessor = new Visitors.AccessorPredicateVisitor(equal, parent);
            return(accessor);
        }
        private static IPredicateVisitor CombinePredicateVisitors(IPredicateVisitor left, IPredicateVisitor right)
        {
            EqualPredicateVisitor equalLeft  = left as EqualPredicateVisitor;
            EqualPredicateVisitor equalRight = right as EqualPredicateVisitor;

            Visitors.AccessorPredicateVisitor accessorLeft  = equalLeft?.Left as Visitors.AccessorPredicateVisitor;
            Visitors.AccessorPredicateVisitor accessorRight = equalRight?.Left as Visitors.AccessorPredicateVisitor;
            IPredicateVisitor collection;

            if (equalLeft?.Right is RangeCollectionPredicateVisitor rangeLeft &&
                equalRight?.Right is RangeCollectionPredicateVisitor rangeRight)
            {
                List <RangePredicateVisitor> combinedRanges = new List <RangePredicateVisitor>();
                combinedRanges.AddRange(rangeLeft.Ranges);
                combinedRanges.AddRange(rangeRight.Ranges);
                collection = new RangeCollectionPredicateVisitor(combinedRanges);
            }
        private static bool HasSameParents(IPredicateVisitor left, IPredicateVisitor right)
        {
            bool result = false;
            EqualPredicateVisitor equalLeft     = left as EqualPredicateVisitor;
            EqualPredicateVisitor equalRight    = right as EqualPredicateVisitor;
            IPredicateVisitor     leftProperty  = equalLeft?.Left;
            IPredicateVisitor     rightProperty = equalRight?.Left;

            while (leftProperty is Visitors.AccessorPredicateVisitor accessorLeft && rightProperty is Visitors.AccessorPredicateVisitor accessorRight)
            {
                result        = ArePropertiesEqual(accessorLeft, accessorRight);
                leftProperty  = accessorLeft.Parent;
                rightProperty = accessorRight.Parent;
            }

            return(result);
        }