protected override Expression VisitConstant(ConstantExpression constantExpression) { var shaper = constantExpression.Value as Shaper; if (shaper != null) { foreach (var queryAnnotation in _relationalQueryCompilationContext.QueryAnnotations .Where(qa => shaper.IsShaperForQuerySource(qa.QuerySource))) { queryAnnotation.QuerySource = _querySource; } if (!_relationalQueryCompilationContext.QuerySourceRequiresMaterialization(_querySource) && shaper is EntityShaper) { return(Expression.Constant(new ValueBufferShaper(_querySource))); } shaper.UpdateQuerySource(_querySource); _selectExpression.ExplodeStarProjection(); } return(base.VisitConstant(constantExpression)); }
protected override Expression VisitMethodCall(MethodCallExpression methodCallExpression) { if (RelationalEntityQueryableExpressionVisitor.IsCreateMethod(methodCallExpression)) { var newArguments = methodCallExpression.Arguments.ToList(); var innerQuerySource = ((ConstantExpression)newArguments[0]).Value; foreach (var queryAnnotation in _relationalQueryCompilationContext.QueryAnnotations .Where(qa => qa.QuerySource == innerQuerySource)) { queryAnnotation.QuerySource = _querySource; } newArguments[0] = Expression.Constant(_querySource); if (!_relationalQueryCompilationContext.QuerySourceRequiresMaterialization(_querySource) && methodCallExpression.Method .MethodIsClosedFormOf(RelationalEntityQueryableExpressionVisitor.CreateEntityMethodInfo)) { var createValueBufferMethod = RelationalEntityQueryableExpressionVisitor.CreateValueBufferMethodInfo; var parameterCount = createValueBufferMethod.GetParameters().Count(); newArguments.RemoveRange(parameterCount, newArguments.Count - parameterCount); return(Expression.Call(createValueBufferMethod, newArguments)); } _selectExpression.ExplodeStarProjection(); return(methodCallExpression.Update(methodCallExpression.Object, newArguments)); } var arguments = VisitAndConvert(methodCallExpression.Arguments, "VisitMethodCall"); if (arguments != methodCallExpression.Arguments) { if (methodCallExpression.Method.MethodIsClosedFormOf( _relationalQueryCompilationContext.QueryMethodProvider.ShapedQueryMethod)) { return(Expression.Call( _relationalQueryCompilationContext.QueryMethodProvider.ShapedQueryMethod .MakeGenericMethod(((LambdaExpression)arguments[2]).ReturnType), arguments)); } if (methodCallExpression.Method.MethodIsClosedFormOf( _relationalQueryCompilationContext.LinqOperatorProvider.Cast) && arguments[0].Type.GetSequenceType() == typeof(ValueBuffer)) { return(arguments[0]); } } return(base.VisitMethodCall(methodCallExpression)); }