public void EvaluateWholeQueryTree()
        {
// ReSharper disable ConvertToConstant.Local
            var i = 1;
// ReSharper restore ConvertToConstant.Local

            var source1 = ExpressionHelper.CreateQueryable <Cook> ();
            var source2 = ExpressionHelper.CreateQueryable <Cook> ();
            var query   = from s1 in source1
                          from s2 in source2
                          where 2 > i + 5
                          select s1.ID + (1 + i);

            var partiallyEvaluatedExpression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(query.Expression);

            var selectMethodCallExpression     = (MethodCallExpression)partiallyEvaluatedExpression;
            var whereMethodCallExpression      = (MethodCallExpression)selectMethodCallExpression.Arguments[0];
            var selectManyMethodCallExpression = (MethodCallExpression)whereMethodCallExpression.Arguments[0];

            var selectSelectorNavigator = new ExpressionTreeNavigator(selectMethodCallExpression.Arguments[1]);
            var wherePredicateNavigator = new ExpressionTreeNavigator(whereMethodCallExpression.Arguments[1]);
            var selectManyCollectionSelectorNavigator = new ExpressionTreeNavigator(selectManyMethodCallExpression.Arguments[1]);

            Assert.That(selectSelectorNavigator.Operand.Body.Right.Value, Is.EqualTo(2));
            Assert.That(wherePredicateNavigator.Operand.Body.Value, Is.EqualTo(false));
            Assert.That(selectManyCollectionSelectorNavigator.Operand.Body.Value, Is.SameAs(source2));
        }
        public void EvaluateWholeQueryTree_WhoseLambdasAreInMemberExpressions_InsteadOfUnaryExpressions()
        {
            var source = ExpressionHelper.CreateQueryable <Cook> ();

            Expression <Func <Cook, bool> > predicate = s1 => false;
            var queryExpression = ExpressionHelper.MakeExpression(() => source.Where(predicate));

            Assert.That(((MethodCallExpression)queryExpression).Arguments[1].NodeType, Is.EqualTo(ExpressionType.MemberAccess),
                        "Usually, this would be a UnaryExpression (Quote containing the Lambda); but we pass a MemberExpression containing the lambda.");

            var partiallyEvaluatedExpression  = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(queryExpression);
            var whereMethodCallExpression     = (MethodCallExpression)partiallyEvaluatedExpression;
            var wherePredicateNavigator       = new ExpressionTreeNavigator(whereMethodCallExpression.Arguments[1]);
            var wherePredicateLambdaNavigator = new ExpressionTreeNavigator((Expression)wherePredicateNavigator.Value);

            Assert.That(wherePredicateLambdaNavigator.Body.Value, Is.EqualTo(false));
        }
        public void EvaluateWholeQueryTree_ThatDoesNotUseItsParameters()
        {
            var source = ExpressionHelper.CreateQueryable <Cook> ();
            var query  = from s1 in source
                         where false
                         select 0 + int.Parse("0");

            var partiallyEvaluatedExpression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(query.Expression);

            var selectMethodCallExpression = (MethodCallExpression)partiallyEvaluatedExpression;
            var whereMethodCallExpression  = (MethodCallExpression)selectMethodCallExpression.Arguments[0];

            var selectSelectorNavigator = new ExpressionTreeNavigator(selectMethodCallExpression.Arguments[1]);
            var wherePredicateNavigator = new ExpressionTreeNavigator(whereMethodCallExpression.Arguments[1]);

            Assert.That(selectSelectorNavigator.Operand.Body.Value, Is.EqualTo(0));
            Assert.That(wherePredicateNavigator.Operand.Body.Value, Is.EqualTo(false));
        }
    public void EvaluateWholeQueryTree_WhoseLambdasAreInMemberExpressions_InsteadOfUnaryExpressions ()
    {
      var source = ExpressionHelper.CreateQueryable<Cook> ();

      Expression<Func<Cook, bool>> predicate = s1 => false;
      var queryExpression = ExpressionHelper.MakeExpression (() => source.Where (predicate));

      Assert.That (((MethodCallExpression) queryExpression).Arguments[1].NodeType, Is.EqualTo (ExpressionType.MemberAccess),
          "Usually, this would be a UnaryExpression (Quote containing the Lambda); but we pass a MemberExpression containing the lambda.");

      var partiallyEvaluatedExpression = PartialEvaluatingExpressionVisitor.EvaluateIndependentSubtrees (
          queryExpression,
          new TestEvaluatableExpressionFilter());
      var whereMethodCallExpression = (MethodCallExpression) partiallyEvaluatedExpression;
      var wherePredicateNavigator = new ExpressionTreeNavigator (whereMethodCallExpression.Arguments[1]);
      var wherePredicateLambdaNavigator = new ExpressionTreeNavigator ((Expression) wherePredicateNavigator.Value);

      Assert.That (wherePredicateLambdaNavigator.Body.Value, Is.EqualTo (false));
    }
    public void EvaluateWholeQueryTree_ThatDoesNotUseItsParameters ()
    {
      var source = ExpressionHelper.CreateQueryable<Cook> ();
      var query = from s1 in source
                  where false
                  select 0 + int.Parse ("0");

      var partiallyEvaluatedExpression = PartialEvaluatingExpressionVisitor.EvaluateIndependentSubtrees (
          query.Expression,
          new TestEvaluatableExpressionFilter());

      var selectMethodCallExpression = (MethodCallExpression) partiallyEvaluatedExpression;
      var whereMethodCallExpression = (MethodCallExpression) selectMethodCallExpression.Arguments[0];

      var selectSelectorNavigator = new ExpressionTreeNavigator (selectMethodCallExpression.Arguments[1]);
      var wherePredicateNavigator = new ExpressionTreeNavigator (whereMethodCallExpression.Arguments[1]);

      Assert.That (selectSelectorNavigator.Operand.Body.Value, Is.EqualTo (0));
      Assert.That (wherePredicateNavigator.Operand.Body.Value, Is.EqualTo (false));
    }
    public void EvaluateWholeQueryTree ()
    {
// ReSharper disable ConvertToConstant.Local
      var i = 1;
// ReSharper restore ConvertToConstant.Local

      var source1 = ExpressionHelper.CreateQueryable<Cook> ();
      var source2 = ExpressionHelper.CreateQueryable<Cook> ();
      var query = from s1 in source1
                  from s2 in source2
                  where 2 > i + 5
                  select s1.ID + (1 + i);

      var partiallyEvaluatedExpression = PartialEvaluatingExpressionVisitor.EvaluateIndependentSubtrees (
          query.Expression,
          new TestEvaluatableExpressionFilter());

      var selectMethodCallExpression = (MethodCallExpression) partiallyEvaluatedExpression;
      var whereMethodCallExpression = (MethodCallExpression) selectMethodCallExpression.Arguments[0];
      var selectManyMethodCallExpression = (MethodCallExpression) whereMethodCallExpression.Arguments[0];

      var selectSelectorNavigator = new ExpressionTreeNavigator (selectMethodCallExpression.Arguments[1]);
      var wherePredicateNavigator = new ExpressionTreeNavigator (whereMethodCallExpression.Arguments[1]);
      var selectManyCollectionSelectorNavigator = new ExpressionTreeNavigator (selectManyMethodCallExpression.Arguments[1]);

      Assert.That (selectSelectorNavigator.Operand.Body.Right.Value, Is.EqualTo (2));
      Assert.That (wherePredicateNavigator.Operand.Body.Value, Is.EqualTo (false));
      Assert.That (selectManyCollectionSelectorNavigator.Operand.Body.Value, Is.SameAs (source2));
    }