protected override Expression VisitMethodCallExpression(MethodCallExpression expression)
        {
            var newArguments = VisitAndConvert(expression.Arguments, "VisitMethodCallExpression");

            if ((expression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateEntityMethodInfo) ||
                 expression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateValueReaderMethodInfo)) &&
                ((ConstantExpression)expression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (Expression.Call(
                         _getValueMethodInfo,
                         expression.Arguments[0],
                         expression.Arguments[2],
                         expression.Arguments[3]));
            }

            if (expression.Method.MethodIsClosedFormOf(
                    QuerySourceScope.GetResultMethodInfo) &&
                ((ConstantExpression)expression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (QuerySourceScope.GetResult(
                         expression.Object,
                         _outerQuerySource,
                         typeof(bool)));
            }

            if (newArguments != expression.Arguments)
            {
                if (expression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod))
                {
                    return(Expression.Call(
                               _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod
                               .MakeGenericMethod(typeof(QuerySourceScope <bool>)),
                               newArguments));
                }

                if (expression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.LinqOperatorProvider.Select))
                {
                    return
                        (Expression.Call(
                             _relationalQueryCompilationContext.LinqOperatorProvider.First
                             .MakeGenericMethod(typeof(bool)),
                             Expression.Call(
                                 _relationalQueryCompilationContext.LinqOperatorProvider.Select
                                 .MakeGenericMethod(
                                     typeof(QuerySourceScope),
                                     typeof(bool)),
                                 newArguments)));
                }

                return(Expression.Call(expression.Method, newArguments));
            }

            return(expression);
        }
예제 #2
0
        public override Expression VisitExpression(Expression expression)
        {
            if (expression != null &&
                !(expression is QuerySourceReferenceExpression))
            {
                var sqlExpression
                    = _sqlTranslatingExpressionTreeVisitor.VisitExpression(expression);

                if (sqlExpression == null)
                {
                    _requiresClientEval = true;
                }
                else
                {
                    var selectExpression
                        = QueryModelVisitor.TryGetQuery(_querySource);

                    Debug.Assert(selectExpression != null);

                    if (!(expression is NewExpression))
                    {
                        var columnExpression = sqlExpression as ColumnExpression;

                        if (columnExpression != null)
                        {
                            selectExpression.AddToProjection(columnExpression);

                            return(expression);
                        }

                        var index = selectExpression.AddToProjection(sqlExpression);

                        return
                            (QueryModelVisitor.BindReadValueMethod(
                                 expression.Type,
                                 QuerySourceScope.GetResult(
                                     EntityQueryModelVisitor.QuerySourceScopeParameter,
                                     _querySource,
                                     typeof(IValueReader)),
                                 index));
                    }
                }
            }

            return(base.VisitExpression(expression));
        }
        protected override Expression VisitMethodCallExpression(MethodCallExpression methodCallExpression)
        {
            var newObject = VisitExpression(methodCallExpression.Object);

            if (newObject != methodCallExpression.Object)
            {
                return(newObject);
            }

            var newArguments = VisitAndConvert(methodCallExpression.Arguments, "VisitMethodCallExpression");

            if ((methodCallExpression.Method.MethodIsClosedFormOf(RelationalQueryModelVisitor.CreateEntityMethodInfo) ||
                 ReferenceEquals(methodCallExpression.Method, RelationalQueryModelVisitor.CreateValueReaderMethodInfo)) &&
                ((ConstantExpression)methodCallExpression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (Expression.Call(
                         _getValueMethodInfo,
                         methodCallExpression.Arguments[0],
                         methodCallExpression.Arguments[2],
                         methodCallExpression.Arguments[3]));
            }

            if (methodCallExpression.Method.MethodIsClosedFormOf(
                    QuerySourceScope.GetResultMethodInfo) &&
                ((ConstantExpression)methodCallExpression.Arguments[0]).Value == _outerQuerySource)
            {
                return
                    (QuerySourceScope.GetResult(
                         methodCallExpression.Object,
                         _outerQuerySource,
                         typeof(TResult)));
            }

            if (newArguments != methodCallExpression.Arguments)
            {
                if (methodCallExpression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod))
                {
                    return(Expression.Call(
                               _relationalQueryCompilationContext.QueryMethodProvider.QueryMethod
                               .MakeGenericMethod(typeof(QuerySourceScope <TResult>)),
                               newArguments));
                }

                if (methodCallExpression.Method.MethodIsClosedFormOf(
                        _relationalQueryCompilationContext.LinqOperatorProvider.Select))
                {
                    return
                        (ResultOperatorHandler.CallWithPossibleCancellationToken(
                             _relationalQueryCompilationContext.LinqOperatorProvider._First
                             .MakeGenericMethod(typeof(TResult)),
                             Expression.Call(
                                 _relationalQueryCompilationContext.LinqOperatorProvider.Select
                                 .MakeGenericMethod(
                                     typeof(QuerySourceScope),
                                     typeof(TResult)),
                                 newArguments)));
                }

                return(Expression.Call(methodCallExpression.Method, newArguments));
            }

            return(methodCallExpression);
        }