Beispiel #1
0
            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));
            }