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