public void AddQuerySourcesRequiringMaterialization(QueryModel queryModel) { var requiresMaterializationExpressionVisitor = _requiresMaterializationExpressionVisitorFactory .Create(_queryModelVisitor); var querySourcesRequiringMaterialization = requiresMaterializationExpressionVisitor .FindQuerySourcesRequiringMaterialization(queryModel); var groupJoinCompensatingVisitor = new GroupJoinMaterializationCompensatingVisitor(); groupJoinCompensatingVisitor.VisitQueryModel(queryModel); var blockedMemberPushdownCompensatingVisitor = new BlockedMemberPushdownCompensatingVisitor(); queryModel.TransformExpressions(blockedMemberPushdownCompensatingVisitor.Visit); var setResultOperatorsCompensatingVisitor = new SetResultOperatorsCompensatingVisitor(this); setResultOperatorsCompensatingVisitor.VisitQueryModel(queryModel); _querySourcesRequiringMaterialization.UnionWith( querySourcesRequiringMaterialization .Concat(groupJoinCompensatingVisitor.QuerySources) .Concat(blockedMemberPushdownCompensatingVisitor.QuerySources)); }
/// <summary> /// Determines all query sources that require materialization. /// </summary> /// <param name="queryModelVisitor"> The query model visitor. </param> /// <param name="queryModel"> The query model. </param> public virtual void FindQuerySourcesRequiringMaterialization( [NotNull] EntityQueryModelVisitor queryModelVisitor, [NotNull] QueryModel queryModel) { Check.NotNull(queryModelVisitor, nameof(queryModelVisitor)); Check.NotNull(queryModel, nameof(queryModel)); var requiresMaterializationExpressionVisitor = _requiresMaterializationExpressionVisitorFactory .Create(queryModelVisitor); var querySourcesRequiringMaterialization = requiresMaterializationExpressionVisitor .FindQuerySourcesRequiringMaterialization(queryModel); var groupJoinCompensatingVisitor = new GroupJoinMaterializationCompensatingVisitor(); groupJoinCompensatingVisitor.VisitQueryModel(queryModel); var optionalCollectionNavigationCompensatingVisitor = new OptionalCollectionNavigationCompensatingVisitor(); optionalCollectionNavigationCompensatingVisitor.VisitQueryModel(queryModel); QuerySourcesRequiringMaterialization.UnionWith( querySourcesRequiringMaterialization .Concat(groupJoinCompensatingVisitor.QuerySources) .Concat(optionalCollectionNavigationCompensatingVisitor.QuerySources)); }
/// <summary> /// Determines all query sources that require materialization. /// </summary> /// <param name="queryModelVisitor"> The query model visitor. </param> /// <param name="queryModel"> The query model. </param> public virtual void FindQuerySourcesRequiringMaterialization( [NotNull] EntityQueryModelVisitor queryModelVisitor, [NotNull] QueryModel queryModel) { Check.NotNull(queryModelVisitor, nameof(queryModelVisitor)); Check.NotNull(queryModel, nameof(queryModel)); _querySourcesRequiringMaterialization = _requiresMaterializationExpressionVisitorFactory .Create(queryModelVisitor) .FindQuerySourcesRequiringMaterialization(queryModel); var groupJoinClauses = queryModel.BodyClauses.OfType <GroupJoinClause>().ToList(); if (groupJoinClauses.Any()) { _querySourcesRequiringMaterialization.Add(queryModel.MainFromClause); foreach (var groupJoinClause in groupJoinClauses) { _querySourcesRequiringMaterialization.Add(groupJoinClause.JoinClause); var subQueryInnerSequence = groupJoinClause.JoinClause.InnerSequence as SubQueryExpression; if (subQueryInnerSequence != null) { var subQuerySourcesRequiringMaterialization = _requiresMaterializationExpressionVisitorFactory .Create(queryModelVisitor) .FindQuerySourcesRequiringMaterialization(subQueryInnerSequence.QueryModel); foreach (var subQuerySource in subQuerySourcesRequiringMaterialization) { _querySourcesRequiringMaterialization.Add(subQuerySource); } } } } }
public virtual void FindQuerySourcesRequiringMaterialization( [NotNull] EntityQueryModelVisitor queryModelVisitor, [NotNull] QueryModel queryModel) { Check.NotNull(queryModelVisitor, nameof(queryModelVisitor)); Check.NotNull(queryModel, nameof(queryModel)); _querySourcesRequiringMaterialization = _requiresMaterializationExpressionVisitorFactory .Create(queryModelVisitor) .FindQuerySourcesRequiringMaterialization(queryModel); foreach (var groupJoinClause in queryModel.BodyClauses.OfType <GroupJoinClause>()) { _querySourcesRequiringMaterialization.Add(groupJoinClause.JoinClause); } }
/// <summary> /// Determines all query sources that require materialization. /// </summary> /// <param name="queryModelVisitor"> The query model visitor. </param> /// <param name="queryModel"> The query model. </param> public virtual void FindQuerySourcesRequiringMaterialization( [NotNull] EntityQueryModelVisitor queryModelVisitor, [NotNull] QueryModel queryModel) { Check.NotNull(queryModelVisitor, nameof(queryModelVisitor)); Check.NotNull(queryModel, nameof(queryModel)); var requiresMaterializationExpressionVisitor = _requiresMaterializationExpressionVisitorFactory .Create(queryModelVisitor); _querySourcesRequiringMaterialization = requiresMaterializationExpressionVisitor .FindQuerySourcesRequiringMaterialization(queryModel); var groupJoinMaterializationExpressionVisitor = new RequiresMaterializationForGroupJoinExpressionVisitor(); var groupJoinMaterializationQueryModelVistor = new RequiresMaterializationForGroupJoinQueryModelVisitor( groupJoinMaterializationExpressionVisitor, _querySourcesRequiringMaterialization, requiresMaterializationExpressionVisitor); groupJoinMaterializationExpressionVisitor.QueryModelVisitor = groupJoinMaterializationQueryModelVistor; groupJoinMaterializationQueryModelVistor.VisitQueryModel(queryModel); }