public void ReplaceParameterWithReference_NoClauseRegistered()
        {
            var parameter  = Expression.Parameter(typeof(int), "x");
            var expression = Expression.MakeBinary(ExpressionType.Add, Expression.Constant(1), parameter);

            QuerySourceExpressionNodeUtility.ReplaceParameterWithReference(_node, parameter, expression, _context);
        }
        public void ReplaceParameterWithReference()
        {
            _context.AddContextInfo(_node, _querySource);

            var parameter  = Expression.Parameter(typeof(int), "x");
            var expression = Expression.MakeBinary(ExpressionType.Add, Expression.Constant(1), parameter);
            var result     = QuerySourceExpressionNodeUtility.ReplaceParameterWithReference(_node, parameter, expression, _context);

            var expected = ExpressionHelper.Resolve <int, int> (_querySource, (i => 1 + i));

            ExpressionTreeComparer.CheckAreEqualTrees(expected, result);
        }
Example #3
0
 public Expression GetResolvedResultSelector(ClauseGenerationContext clauseGenerationContext)
 {
     return
         (_cachedResultSelector.GetOrCreate(
              r => r.GetResolvedExpression(
                  QuerySourceExpressionNodeUtility.ReplaceParameterWithReference(
                      this,
                      ResultSelector.Parameters[1],
                      ResultSelector.Body,
                      clauseGenerationContext),
                  ResultSelector.Parameters[0],
                  clauseGenerationContext)));
 }
        public Expression Resolve(ParameterExpression inputParameter, Expression expressionToBeResolved,
                                  ClauseGenerationContext clauseGenerationContext)
        {
            if (inputParameter == null)
            {
                throw new ArgumentNullException(nameof(inputParameter));
            }
            if (expressionToBeResolved == null)
            {
                throw new ArgumentNullException(nameof(expressionToBeResolved));
            }

            return(QuerySourceExpressionNodeUtility.ReplaceParameterWithReference(
                       this,
                       inputParameter,
                       expressionToBeResolved,
                       clauseGenerationContext));
        }
        public Expression GetResolvedAdaptedSelector(ClauseGenerationContext clauseGenerationContext)
        {
            if (!IsLetNode)
            {
                throw new InvalidOperationException("This node is not a 'let' node.");
            }

            // Adapt the selector so that it contains a reference to the associated LetClause, i.e., instead of "x => new { x = x, y = expr }",
            // make it "x => new { x = x, y = [letClause] }"
            return(_resolvedAdaptedSelector.GetOrCreate(
                       r =>
            {
                var letClause = QuerySourceExpressionNodeUtility.GetQuerySourceForNode(this, clauseGenerationContext);

                var adaptedSelectorBody = Expression.New(
                    _letConstruction.Constructor,
                    new[] { _letConstruction.Arguments[0], new QuerySourceReferenceExpression(letClause) },
                    _letConstruction.Members);
                return r.GetResolvedExpression(adaptedSelectorBody, Selector.Parameters[0], clauseGenerationContext);
            }));
        }
Example #6
0
        public Expression GetResolvedResultSelector(ClauseGenerationContext clauseGenerationContext)
        {
            // our result selector usually looks like this: (i, j) => new { i = i, j = j }
            // with the data for i coming from the previous node and j identifying the data from this node

            // we resolve the selector by first substituting j by a QuerySourceReferenceExpression pointing back to us, before asking the previous node
            // to resolve i

            return(_cachedResultSelector.GetOrCreate(
                       r => r.GetResolvedExpression(
                           QuerySourceExpressionNodeUtility.ReplaceParameterWithReference
                               (this, ResultSelector.Parameters[0],
                               ResultSelector.Body,
                               clauseGenerationContext),
                           ResultSelector.Parameters[0],
                           clauseGenerationContext)));

            //  return _cachedResultSelector.GetOrCreate(
            //r => r.GetResolvedExpression(
            //         QuerySourceExpressionNodeUtility.ReplaceParameterWithReference(this, ResultSelector.Parameters[1], ResultSelector.Body, clauseGenerationContext),
            //         ResultSelector.Parameters[0],
            //         clauseGenerationContext));
        }
 public void GetQuerySourceForNode_NoClauseRegistered()
 {
     QuerySourceExpressionNodeUtility.GetQuerySourceForNode(_node, _context);
 }
        public void GetQuerySourceForNode()
        {
            _context.AddContextInfo(_node, _querySource);

            Assert.That(QuerySourceExpressionNodeUtility.GetQuerySourceForNode(_node, _context), Is.SameAs(_querySource));
        }