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;
 }
Пример #3
0
        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);
 }