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

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

            string methodName = Mapping.AllowedMethods[methodCallExpression.Method.Name];

            var    memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
            string currentName      = memberExpression.Member.Name;
            var    callerParent     = predicateVisitorFactory.Create(memberExpression.Expression);

            ConstantPredicateVisitor constant = new ConstantPredicateVisitor(currentName);

            // c.Key.In("c14", "c15")
            if (methodCallExpression.Arguments.Count > 1)
            {
                IPredicateVisitor methodArguments = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
                var inner = new BinaryPredicateVisitor(constant, methodName, methodArguments);

                return(CombinePredicates(callerParent, inner));
            }

            // c.Key.IsDefined()
            var binaryPredicateVisitor = new BinaryPredicateVisitor(constant, methodName, new ConstantPredicateVisitor(string.Empty));

            return(CombinePredicates(callerParent, binaryPredicateVisitor));
        }
        // When there is more than one property accessor, the last accessor needs to be taken out and added to the binary logical predicate.
        // property(property(property operator value)
        private static IPredicateVisitor CombinePredicates(IPredicateVisitor left, string operatorSign, IPredicateVisitor right)
        {
            var containerLeft = (ContainerPredicateVisitor)left;
            IPredicateVisitor      innerLeft = containerLeft.Inner;
            BinaryPredicateVisitor binaryPredicateVisitor = new BinaryPredicateVisitor(innerLeft, operatorSign, right);

            IPredicateVisitor parent = containerLeft.Parent;

            if (parent == null)
            {
                return(new ContainerPredicateVisitor(binaryPredicateVisitor, null));
            }

            IPredicateVisitor         innerContainer    = binaryPredicateVisitor;
            ContainerPredicateVisitor combinedContainer = null;

            while (parent != null)
            {
                if (CanBeCombined(parent))
                {
                    var container = (ContainerPredicateVisitor)parent;
                    innerContainer    = new ContainerPredicateVisitor(innerContainer, container.Inner);
                    combinedContainer = new ContainerPredicateVisitor(innerContainer, container.Parent);
                    parent            = container.Parent;
                }
            }

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

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

            string            operatorSign = Mapping.ComparisonMethodOperators[methodCallExpression.Method.Name];
            IPredicateVisitor left         = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            IPredicateVisitor right        = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);

            BinaryPredicateVisitor binary = new BinaryPredicateVisitor(left, operatorSign, right);

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

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

            string methodName = this.AllowedMethods[methodCallExpression.Method.Name];
            ConstantPredicateVisitor methodNameConstant = new ConstantPredicateVisitor(methodName);
            IPredicateVisitor        methodCaller       = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);
            IPredicateVisitor        methodArguments    = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);

            ContainerPredicateVisitor container = new ContainerPredicateVisitor(methodArguments, methodNameConstant, true);
            BinaryPredicateVisitor    binary    = new BinaryPredicateVisitor(methodCaller, string.Empty, container);

            return(binary);
        }
        private static IPredicateVisitor CombinePredicateVisitors(IPredicateVisitor left, string operatorSign, IPredicateVisitor right)
        {
            IPredicateVisitor         innerLeft  = left;
            IPredicateVisitor         innerRight = right;
            ContainerPredicateVisitor container  = null;

            while (innerLeft is ContainerPredicateVisitor containerLeft && innerRight is ContainerPredicateVisitor containerRight)
            {
                innerLeft  = containerLeft.Inner;
                innerRight = containerRight.Inner;
                container  = new ContainerPredicateVisitor(containerLeft.Parent, container);
            }

            if (innerLeft is BinaryPredicateVisitor binaryLeft && innerRight is BinaryPredicateVisitor binaryRight)
            {
                BinaryPredicateVisitor binaryPredicateVisitor = new BinaryPredicateVisitor(innerLeft, operatorSign, innerRight);

                return(CombinePredicates(container, binaryPredicateVisitor));
            }

            return(null);
        }