private Shaper CreateShaper(Type elementType, IEntityType entityType, SelectExpression selectExpression)
        {
            Shaper shaper;

            if (QueryModelVisitor.QueryCompilationContext
                .QuerySourceRequiresMaterialization(_querySource) ||
                QueryModelVisitor.RequiresClientEval)
            {
                var materializerExpression
                    = _materializerFactory
                      .CreateMaterializer(
                          entityType,
                          selectExpression,
                          (p, se) =>
                          se.AddToProjection(
                              p,
                              _querySource),
                          out var typeIndexMap);

                var materializer = materializerExpression.Compile();

                shaper
                    = (Shaper)_createEntityShaperMethodInfo.MakeGenericMethod(elementType)
                      .Invoke(
                          obj: null,
                          parameters: new object[]
                {
                    _querySource,
                    QueryModelVisitor.QueryCompilationContext.IsTrackingQuery &&
                    entityType.FindPrimaryKey() != null,
                    entityType.FindPrimaryKey(),
                    materializer,
                    materializerExpression,
                    typeIndexMap,
                    QueryModelVisitor.QueryCompilationContext.IsQueryBufferRequired &&
                    entityType.FindPrimaryKey() != null
                });
            }
            else
            {
                shaper = new ValueBufferShaper(_querySource);
            }

            return(shaper);
        }
コード例 #2
0
        private Shaper CreateShaper(Type elementType, IEntityType entityType, SelectExpression selectExpression)
        {
            Shaper shaper;

            if (QueryModelVisitor.QueryCompilationContext
                .QuerySourceRequiresMaterialization(_querySource) ||
                QueryModelVisitor.RequiresClientEval)
            {
                var materializer
                    = _materializerFactory
                      .CreateMaterializer(
                          entityType,
                          selectExpression,
                          (p, se) =>
                          se.AddToProjection(
                              _relationalAnnotationProvider.For(p).ColumnName,
                              p,
                              _querySource),
                          _querySource).Compile();

                shaper
                    = (Shaper)_createEntityShaperMethodInfo.MakeGenericMethod(elementType)
                      .Invoke(null, new object[]
                {
                    _querySource,
                    entityType.DisplayName(),
                    QueryModelVisitor.QueryCompilationContext.IsTrackingQuery,
                    entityType.FindPrimaryKey(),
                    materializer,
                    QueryModelVisitor.QueryCompilationContext.IsQueryBufferRequired
                });
            }
            else
            {
                DiscriminateProjectionQuery(entityType, selectExpression, _querySource);

                shaper = new ValueBufferShaper(_querySource);
            }

            return(shaper);
        }
コード例 #3
0
            private bool CanTranslate(Expression expression)
            {
                // Check for Query shape
                if (IsAggregateGroupBySelector(expression))
                {
                    var groupByResultOperator =
                        (GroupResultOperator)((SubQueryExpression)((MainFromClause)_groupQuerySource).FromExpression)
                        .QueryModel.ResultOperators
                        .Last();

                    _keySelector = groupByResultOperator.KeySelector;
                    var elementSelector = groupByResultOperator.ElementSelector;

                    if (!(elementSelector is QuerySourceReferenceExpression) &&
                        _sqlTranslatingExpressionVisitorFactory.Create(
                            _queryModelVisitor,
                            _selectExpression)
                        .Visit(groupByResultOperator.ElementSelector) == null)
                    {
                        return(false);
                    }

                    _selectExpression.ClearOrderBy();
                    _selectExpression.ClearProjection();

                    UpdateGroupQuerySourceParameter(typeof(ValueBuffer));

                    _projectionExpressionVisitor.Visit(_keySelector);
                    var columns = _selectExpression.Projection.ToArray();
                    _selectExpression.ClearProjection();

                    if (!(elementSelector is QuerySourceReferenceExpression))
                    {
                        _projectionExpressionVisitor.Visit(groupByResultOperator.ElementSelector);
                    }

                    if (_selectExpression.Projection.Count > 1)
                    {
                        _selectExpression.ClearProjection();
                    }

                    _selectExpression.AddToGroupBy(columns);

                    var shapedQuery =
                        (MethodCallExpression)((MethodCallExpression)_queryModelVisitor.Expression).Arguments[0];

                    var valueBufferShaper = new ValueBufferShaper(_groupQuerySource);

                    var groupShapedQuery = Expression.Call(
                        _queryModelVisitor.QueryCompilationContext
                        .QueryMethodProvider
                        .ShapedQueryMethod
                        .MakeGenericMethod(valueBufferShaper.Type),
                        shapedQuery.Arguments[0],
                        shapedQuery.Arguments[1],
                        Expression.Constant(valueBufferShaper));

                    _queryModelVisitor.Expression = groupShapedQuery;

                    UpdateGroupQuerySourceParameter(groupShapedQuery.Type);

                    return(true);
                }

                return(false);
            }