public object Execute(Expression expression, bool isEnumerable)
        {
            var visitor = new Visitor.RequestExpressionVisitor(expression);

            visitor.Visit();
            Operations = visitor.Operations;
            var rt       = visitor.GetReturnType();
            var type     = typeof(List <>).MakeGenericType(rt);
            var instance = CreateInstance(type);

            return(instance);
        }
Example #2
0
        public void Visitor_MultipleOrderingDifferentDirection()
        {
            // Arrange
            var context = new FakeQueryContext(() => new List <Customer>());

            // Act
            var customers = context.GetTable <Customer>();
            var query     = customers.AsQueryable().OrderBy(x => x.Id).ThenByDescending(x => x.Lastname);
            var queryExp  = query.Expression;
            var visitor   = new Visitor.RequestExpressionVisitor(queryExp);

            visitor.Visit();

            // Assert
            var actualOperations = visitor.Operations;

            Assert.AreEqual(2, actualOperations.Count());
            AssertOrderOperation(actualOperations[0] as Visitor.Operation.Order, "Id");
            AssertOrderOperation(actualOperations[1] as Visitor.Operation.Order, "Lastname", Visitor.OrderDirection.Descending);
        }
Example #3
0
        public void Visitor_OrderingDescending()
        {
            // Arrange
            var context = new FakeQueryContext(() => new List <Customer>());

            // Act
            var customers = context.GetTable <Customer>();
            var query     = customers.AsQueryable().OrderByDescending(x => x.Id);
            var queryExp  = query.Expression;
            var visitor   = new Visitor.RequestExpressionVisitor(queryExp);

            visitor.Visit();

            // Assert
            var actualOperations = visitor.Operations;

            Assert.AreEqual(1, actualOperations.Count());
            var operation = actualOperations.First() as Visitor.Operation.Order;

            AssertOrderOperation(operation, "Id", Visitor.OrderDirection.Descending);
        }
Example #4
0
        public void Visitor_OData_SkipSimple()
        {
            // Arrange
            var context = new FakeQueryContext(() => new List <Customer>());
            var limit   = (int)10;

            // Act
            var customers = context.GetTable <Customer>();
            var queryExp  = ODataHelpers.Skip(customers.AsQueryable().Expression, limit, typeof(Customer), true);
            var visitor   = new Visitor.RequestExpressionVisitor(queryExp);

            visitor.Visit();

            // Assert
            var actualOperations = visitor.Operations;

            Assert.AreEqual(1, actualOperations.Count());
            var takeOperation = actualOperations.First();

            Assert.IsTrue(takeOperation.IsSkip);
            Assert.AreEqual(limit, ((Visitor.Operation.Skip)takeOperation).Item);
        }
Example #5
0
        public void Visitor_AndExpression()
        {
            // Arrange
            var context = new FakeQueryContext(() => new List <Customer>());

            // Act
            var customers = context.GetTable <Customer>();
            var query     = customers.AsQueryable().Where(x => x.Firstname == "popo" && x.Lastname == "papa");
            var queryExp  = query.Expression;
            var visitor   = new Visitor.RequestExpressionVisitor(queryExp);

            visitor.Visit();

            // Assert
            var actualOperations = visitor.Operations;

            Assert.AreEqual(1, actualOperations.Count());
            var operation        = actualOperations.First() as Visitor.Operation.Where;
            var compareOperation = operation.Item as Visitor.WhereArgs.BinaryComparison;

            AssertUnaryComparison(compareOperation.Item1, "Firstname", "popo", Visitor.ComparisonKind.Equal);
            Assert.AreEqual(Visitor.BinaryComparisonKind.And, compareOperation.Item2);
            AssertUnaryComparison(compareOperation.Item3, "Lastname", "papa", Visitor.ComparisonKind.Equal);
        }