private static IAsyncEnumerable <T> _Include <T>(
            RelationalQueryContext queryContext,
            IAsyncEnumerable <T> innerResults,
            IQuerySource querySource,
            IReadOnlyList <INavigation> navigationPath,
            IReadOnlyList <Func <IAsyncIncludeRelatedValuesStrategy> > includeRelatedValuesStrategyFactories,
            bool querySourceRequiresTracking)
            where T : QueryResultScope
        {
            queryContext.BeginIncludeScope();

            var includeRelatedValuesStrategies
                = includeRelatedValuesStrategyFactories
                  .Select(f => f())
                  .ToList();

            var relatedValueBuffers
                = includeRelatedValuesStrategies
                  .Select <IAsyncIncludeRelatedValuesStrategy, AsyncRelatedEntitiesLoader>(s => s.GetRelatedValues)
                  .ToArray();

            return
                (innerResults.Select(
                     async(queryResultScope, cancellationToken) =>
            {
                await queryContext.QueryBuffer
                .IncludeAsync(
                    queryResultScope.GetResult(querySource),
                    navigationPath,
                    relatedValueBuffers,
                    cancellationToken,
                    querySourceRequiresTracking);

                return queryResultScope;
            })
                 .Finally(() =>
            {
                foreach (var includeRelatedValuesStrategy in includeRelatedValuesStrategies)
                {
                    includeRelatedValuesStrategy.Dispose();
                }

                queryContext.EndIncludeScope();
            }));
        }
        internal static IAsyncEnumerable <T> _Include <T>(
            RelationalQueryContext queryContext,
            IAsyncEnumerable <T> innerResults,
            Func <T, object> entityAccessor,
            IReadOnlyList <INavigation> navigationPath,
            IReadOnlyList <Func <IAsyncIncludeRelatedValuesStrategy> > includeRelatedValuesStrategyFactories,
            bool querySourceRequiresTracking)
        {
            queryContext.BeginIncludeScope();

            var includeRelatedValuesStrategies
                = includeRelatedValuesStrategyFactories
                  .Select(f => f())
                  .ToList();

            var relatedValueBuffers
                = includeRelatedValuesStrategies
                  .Select <IAsyncIncludeRelatedValuesStrategy, AsyncRelatedEntitiesLoader>(s => s.GetRelatedValues)
                  .ToArray();

            return(innerResults
                   .Select(
                       async(result, cancellationToken) =>
            {
                await queryContext.QueryBuffer
                .IncludeAsync(
                    entityAccessor == null ? result : entityAccessor(result),                 // TODO: Compile time?
                    navigationPath,
                    relatedValueBuffers,
                    cancellationToken,
                    querySourceRequiresTracking);

                return result;
            })
                   .Finally(() =>
            {
                foreach (var includeRelatedValuesStrategy in includeRelatedValuesStrategies)
                {
                    includeRelatedValuesStrategy.Dispose();
                }

                queryContext.EndIncludeScope();
            }));
        }
Ejemplo n.º 3
0
        internal static IEnumerable <T> _Include <T>(
            RelationalQueryContext queryContext,
            IEnumerable <T> innerResults,
            Func <T, object> entityAccessor,
            IReadOnlyList <INavigation> navigationPath,
            IReadOnlyList <Func <IIncludeRelatedValuesStrategy> > includeRelatedValuesStrategyFactories,
            bool querySourceRequiresTracking)
        {
            queryContext.BeginIncludeScope();

            var includeRelatedValuesStrategies
                = includeRelatedValuesStrategyFactories
                  .Select(f => f())
                  .ToList();

            var relatedEntitiesLoaders
                = includeRelatedValuesStrategies
                  .Select <IIncludeRelatedValuesStrategy, RelatedEntitiesLoader>(s => s.GetRelatedValues)
                  .ToArray();

            try
            {
                foreach (var innerResult in innerResults)
                {
                    queryContext.QueryBuffer
                    .Include(
                        entityAccessor == null ? innerResult : entityAccessor(innerResult),     // TODO: Compile time?
                        navigationPath,
                        relatedEntitiesLoaders,
                        querySourceRequiresTracking);

                    yield return(innerResult);
                }
            }
            finally // Need this to run even if innerResults is not fully consumed.
            {
                foreach (var includeRelatedValuesStrategy in includeRelatedValuesStrategies)
                {
                    includeRelatedValuesStrategy.Dispose();
                }

                queryContext.EndIncludeScope();
            }
        }