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); }
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); }