private static IAsyncEnumerable <T> _Include <T>( RelationalQueryContext queryContext, IAsyncEnumerable <T> innerResults, IQuerySource querySource, IReadOnlyList <INavigation> navigationPath, IReadOnlyList <Func <IAsyncIncludeRelatedValuesStrategy> > includeRelatedValuesStrategyFactories) where T : QuerySourceScope { queryContext.BeginIncludeScope(); var includeRelatedValuesStrategies = includeRelatedValuesStrategyFactories .Select(f => f()) .ToList(); var relatedValueReaders = includeRelatedValuesStrategies .Select < IAsyncIncludeRelatedValuesStrategy, Func <EntityKey, Func <IValueReader, EntityKey>, IAsyncEnumerable <IValueReader> > >( s => s.GetRelatedValues) .ToArray(); return (innerResults.Select( async qss => { await queryContext.QueryBuffer .IncludeAsync( qss.GetResult(querySource), navigationPath, relatedValueReaders, queryContext.CancellationToken); return qss; }) .Finally(() => { foreach (var includeRelatedValuesStrategy in includeRelatedValuesStrategies) { includeRelatedValuesStrategy.Dispose(); } queryContext.EndIncludeScope(); })); }
private static IEnumerable <T> _Include <T>( RelationalQueryContext queryContext, IEnumerable <T> innerResults, IQuerySource querySource, IReadOnlyList <INavigation> navigationPath, IReadOnlyList <Func <IIncludeRelatedValuesStrategy> > includeRelatedValuesStrategyFactories, bool querySourceRequiresTracking) where T : QuerySourceScope { queryContext.BeginIncludeScope(); var includeRelatedValuesStrategies = includeRelatedValuesStrategyFactories .Select(f => f()) .ToList(); var relatedEntitiesLoaders = includeRelatedValuesStrategies .Select <IIncludeRelatedValuesStrategy, RelatedEntitiesLoader>(s => s.GetRelatedValues) .ToArray(); return(innerResults .Select(qss => { queryContext.QueryBuffer .Include( qss.GetResult(querySource), navigationPath, relatedEntitiesLoaders, querySourceRequiresTracking); return qss; }) .Finally(() => { foreach (var includeRelatedValuesStrategy in includeRelatedValuesStrategies) { includeRelatedValuesStrategy.Dispose(); } queryContext.EndIncludeScope(); })); }