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