Example #1
0
        protected override Expression VisitShapedQueryExpression(ShapedQueryExpression shapedQueryExpression)
        {
            var shaperBody = InjectEntityMaterializer(shapedQueryExpression.ShaperExpression);

            var selectExpression = (SelectExpression)shapedQueryExpression.QueryExpression;

            shaperBody = new RelationalProjectionBindingRemovingExpressionVisitor(selectExpression).Visit(shaperBody);
            shaperBody = new IncludeCompilingExpressionVisitor(TrackQueryResults).Visit(shaperBody);
            var indexMapParameter = Expression.Parameter(typeof(int[]), "indexMap");

            if (selectExpression.IsNonComposedFromSql())
            {
                shaperBody = new IndexMapInjectingExpressionVisitor(indexMapParameter).Visit(shaperBody);
            }

            var shaperLambda = Expression.Lambda(
                shaperBody,
                QueryCompilationContext.QueryContextParameter,
                RelationalProjectionBindingRemovingExpressionVisitor.DataReaderParameter,
                indexMapParameter,
                _resultCoordinatorParameter);

            return(Expression.New(
                       (Async
                    ? typeof(AsyncQueryingEnumerable <>)
                    : typeof(QueryingEnumerable <>)).MakeGenericType(shaperLambda.ReturnType).GetConstructors()[0],
                       Expression.Convert(QueryCompilationContext.QueryContextParameter, typeof(RelationalQueryContext)),
                       Expression.Constant(_querySqlGeneratorFactory),
                       Expression.Constant(_sqlExpressionFactory),
                       Expression.Constant(_parameterNameGeneratorFactory),
                       Expression.Constant(selectExpression),
                       Expression.Constant(shaperLambda.Compile()),
                       Expression.Constant(_contextType),
                       Expression.Constant(_logger)));
        }
        protected override Expression VisitShapedQueryExpression(ShapedQueryExpression shapedQueryExpression)
        {
            var selectExpression = (SelectExpression)shapedQueryExpression.QueryExpression;

            selectExpression.ApplyTags(_tags);

            var dataReaderParameter        = Expression.Parameter(typeof(DbDataReader), "dataReader");
            var resultCoordinatorParameter = Expression.Parameter(typeof(ResultCoordinator), "resultCoordinator");
            var indexMapParameter          = Expression.Parameter(typeof(int[]), "indexMap");

            var shaper = new ShaperExpressionProcessingExpressionVisitor(
                selectExpression,
                dataReaderParameter,
                resultCoordinatorParameter,
                indexMapParameter)
                         .Inject(shapedQueryExpression.ShaperExpression);

            shaper = InjectEntityMaterializers(shaper);

            shaper = new RelationalProjectionBindingRemovingExpressionVisitor(selectExpression, dataReaderParameter)
                     .Visit(shaper);
            shaper = new CustomShaperCompilingExpressionVisitor(
                dataReaderParameter, resultCoordinatorParameter, IsTracking)
                     .Visit(shaper);

            IReadOnlyList <string> columnNames = null;

            if (selectExpression.IsNonComposedFromSql())
            {
                shaper      = new IndexMapInjectingExpressionVisitor(indexMapParameter).Visit(shaper);
                columnNames = selectExpression.Projection.Select(pe => ((ColumnExpression)pe.Expression).Name).ToList();
            }

            var relationalCommandCache = new RelationalCommandCache(
                Dependencies.MemoryCache,
                RelationalDependencies.SqlExpressionFactory,
                RelationalDependencies.ParameterNameGeneratorFactory,
                RelationalDependencies.QuerySqlGeneratorFactory,
                _useRelationalNulls,
                selectExpression);

            var shaperLambda = (LambdaExpression)shaper;

            return(Expression.New(
                       typeof(QueryingEnumerable <>).MakeGenericType(shaperLambda.ReturnType).GetConstructors()[0],
                       Expression.Convert(QueryCompilationContext.QueryContextParameter, typeof(RelationalQueryContext)),
                       Expression.Constant(relationalCommandCache),
                       Expression.Constant(columnNames, typeof(IReadOnlyList <string>)),
                       Expression.Constant(shaperLambda.Compile()),
                       Expression.Constant(_contextType),
                       Expression.Constant(_logger)));
        }
        protected override Expression VisitShapedQueryExpression(ShapedQueryExpression shapedQueryExpression)
        {
            var selectExpression = (SelectExpression)shapedQueryExpression.QueryExpression;

            selectExpression.ApplyTags(_tags);

            var dataReaderParameter        = Expression.Parameter(typeof(DbDataReader), "dataReader");
            var resultCoordinatorParameter = Expression.Parameter(typeof(ResultCoordinator), "resultCoordinator");
            var indexMapParameter          = Expression.Parameter(typeof(int[]), "indexMap");

            var shaper = new ShaperExpressionProcessingExpressionVisitor(
                selectExpression,
                dataReaderParameter,
                resultCoordinatorParameter,
                indexMapParameter)
                         .Inject(shapedQueryExpression.ShaperExpression);

            shaper = InjectEntityMaterializers(shaper);

            shaper = new RelationalProjectionBindingRemovingExpressionVisitor(selectExpression, dataReaderParameter)
                     .Visit(shaper);
            shaper = new CustomShaperCompilingExpressionVisitor(
                dataReaderParameter, resultCoordinatorParameter, IsTracking)
                     .Visit(shaper);

            if (selectExpression.IsNonComposedFromSql())
            {
                shaper = new IndexMapInjectingExpressionVisitor(indexMapParameter).Visit(shaper);
            }

            var shaperLambda = (LambdaExpression)shaper;

            return(Expression.New(
                       (IsAsync
                    ? typeof(AsyncQueryingEnumerable <>)
                    : typeof(QueryingEnumerable <>)).MakeGenericType(shaperLambda.ReturnType).GetConstructors()[0],
                       Expression.Convert(QueryCompilationContext.QueryContextParameter, typeof(RelationalQueryContext)),
                       Expression.Constant(RelationalDependencies.QuerySqlGeneratorFactory),
                       Expression.Constant(RelationalDependencies.SqlExpressionFactory),
                       Expression.Constant(RelationalDependencies.ParameterNameGeneratorFactory),
                       Expression.Constant(selectExpression),
                       Expression.Constant(shaperLambda.Compile()),
                       Expression.Constant(_contextType),
                       Expression.Constant(_logger)));
        }