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(); })); }
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(); } }