protected override void VisitResultOperators(ObservableCollection <ResultOperatorBase> resultOperators, QueryModel queryModel) { var resultOperatorSources = RequiresMaterializationExpressionVisitor.GetSetResultOperatorSourceExpressions(resultOperators); if (resultOperatorSources.Any()) { // in case of set1.Concat(set2) we also need to add set1 qsre to materialization // reusing existing infrastructure for cases where the projection is not trivial var queryModelCopy = new QueryModel(queryModel.MainFromClause, queryModel.SelectClause); foreach (var bodyClause in queryModel.BodyClauses) { queryModelCopy.BodyClauses.Add(bodyClause); } _querySourcesRequiringMaterializationFinder.AddQuerySourcesRequiringMaterialization(queryModelCopy); foreach (var resultOperatorSource in RequiresMaterializationExpressionVisitor.GetSetResultOperatorSourceExpressions(resultOperators)) { if (resultOperatorSource is SubQueryExpression subQuery) { _querySourcesRequiringMaterializationFinder.AddQuerySourcesRequiringMaterialization(subQuery.QueryModel); } else if (resultOperatorSource is MethodCallExpression methodCall && methodCall.Method.MethodIsClosedFormOf(CollectionNavigationSubqueryInjector.MaterializeCollectionNavigationMethodInfo)) { _querySourcesRequiringMaterializationFinder.AddQuerySourcesRequiringMaterialization(((SubQueryExpression)methodCall.Arguments[1]).QueryModel); } } } }
public RequiresMaterializationForGroupJoinQueryModelVisitor( RequiresMaterializationForGroupJoinExpressionVisitor transformingVisitor, ISet <IQuerySource> querySourcesRequiringMaterialization, RequiresMaterializationExpressionVisitor requiresMaterializationExpressionVisitor) : base(transformingVisitor) { transformingVisitor.QueryModelVisitor = this; _querySourcesRequiringMaterialization = querySourcesRequiringMaterialization; _requiresMaterializationExpressionVisitor = requiresMaterializationExpressionVisitor; }
public virtual void FindQuerySourcesRequiringMaterialization( [NotNull] EntityQueryModelVisitor queryModelVisitor, [NotNull] QueryModel queryModel) { Check.NotNull(queryModelVisitor, nameof(queryModelVisitor)); Check.NotNull(queryModel, nameof(queryModel)); var requiresEntityMaterializationExpressionVisitor = new RequiresMaterializationExpressionVisitor(queryModelVisitor); _querySourcesRequiringMaterialization = requiresEntityMaterializationExpressionVisitor .FindQuerySourcesRequiringMaterialization(queryModel); foreach (var groupJoinClause in queryModel.BodyClauses.OfType <GroupJoinClause>()) { _querySourcesRequiringMaterialization.Add(groupJoinClause.JoinClause); } }
private void MarkForMaterialization(IQuerySource querySource) { RequiresMaterializationExpressionVisitor.HandleUnderlyingQuerySources(querySource, MarkForMaterialization); QuerySources.Add(querySource); }