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); }
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); }
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); }