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));
            }
Example #2
0
        /// <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);
        }