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(); } }
private static IAsyncEnumerable <T> _Include <T>( RelationalQueryContext queryContext, IAsyncEnumerable <T> innerResults, Func <T, object> entityAccessor, IReadOnlyList <INavigation> navigationPath, IReadOnlyList <Func <QueryContext, IAsyncRelatedEntitiesLoader> > relatedEntitiesLoaderFactories, bool querySourceRequiresTracking) { queryContext.BeginIncludeScope(); var relatedEntitiesLoaders = relatedEntitiesLoaderFactories.Select(f => f(queryContext)) .ToArray(); return(innerResults .Select( async(result, cancellationToken) => { await queryContext.QueryBuffer .IncludeAsync( queryContext, entityAccessor == null ? result : entityAccessor(result), // TODO: Compile time? navigationPath, relatedEntitiesLoaders, querySourceRequiresTracking, cancellationToken); return result; }) .Finally(() => { foreach (var relatedEntitiesLoader in relatedEntitiesLoaders) { relatedEntitiesLoader.Dispose(); } queryContext.EndIncludeScope(); })); }
private static IAsyncEnumerable <T> _Include <T>( RelationalQueryContext queryContext, IAsyncEnumerable <T> innerResults, Func <T, object> entityAccessor, IReadOnlyList <INavigation> navigationPath, IReadOnlyList <Func <QueryContext, IAsyncRelatedEntitiesLoader> > relatedEntitiesLoaderFactories, bool querySourceRequiresTracking) { queryContext.BeginIncludeScope(); var relatedEntitiesLoaders = relatedEntitiesLoaderFactories.Select(f => f(queryContext)) .ToArray(); return(new IncludeAsyncEnumerable <T>( queryContext, innerResults, entityAccessor, navigationPath, relatedEntitiesLoaders, querySourceRequiresTracking)); }