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);
            }
Ejemplo n.º 2
0
        public IPredicateVisitor Convert(Expression expression, IPredicateVisitorFactory predicateVisitorFactory)
        {
            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

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

            IPredicateVisitor               from   = predicateVisitorFactory.Create(methodCallExpression.Arguments[1]);
            IPredicateVisitor               to     = predicateVisitorFactory.Create(methodCallExpression.Arguments[2]);
            RangePredicateVisitor           range  = new RangePredicateVisitor(from, to);
            RangeCollectionPredicateVisitor ranges = new RangeCollectionPredicateVisitor(new List <RangePredicateVisitor>()
            {
                range
            });
            IPredicateVisitor parent = predicateVisitorFactory.Create(methodCallExpression.Arguments[0]);

            return(new EqualPredicateVisitor(parent, ranges));
        }