private static void IncludeCollection <TEntity, TIncludingEntity, TIncludedEntity>( QueryContext queryContext, IEnumerable <ValueBuffer> innerValueBuffers, Func <QueryContext, ValueBuffer, TIncludedEntity> innerShaper, TEntity entity, INavigation navigation, INavigation inverseNavigation, Action <TIncludingEntity, TIncludedEntity> fixup, bool trackingQuery) where TIncludingEntity : class, TEntity where TEntity : class where TIncludedEntity : class { if (entity is TIncludingEntity includingEntity) { var collectionAccessor = navigation.GetCollectionAccessor(); collectionAccessor.GetOrCreate(includingEntity, forMaterialization: true); if (trackingQuery) { queryContext.SetNavigationIsLoaded(entity, navigation); } else { NavigationExtensions.SetIsLoadedWhenNoTracking(navigation, entity); } foreach (var valueBuffer in innerValueBuffers) { var relatedEntity = innerShaper(queryContext, valueBuffer); if (!trackingQuery) { fixup(includingEntity, relatedEntity); if (inverseNavigation != null) { NavigationExtensions.SetIsLoadedWhenNoTracking(inverseNavigation, relatedEntity); } } } } }
private static void IncludeReference <TEntity, TIncludingEntity, TIncludedEntity>( QueryContext queryContext, TEntity entity, TIncludedEntity relatedEntity, INavigation navigation, INavigation inverseNavigation, Action <TIncludingEntity, TIncludedEntity> fixup, bool trackingQuery) where TIncludingEntity : class, TEntity where TEntity : class where TIncludedEntity : class { if (entity is TIncludingEntity includingEntity) { if (trackingQuery && navigation.DeclaringEntityType.FindPrimaryKey() != null) { // For non-null relatedEntity StateManager will set the flag if (relatedEntity == null) { queryContext.SetNavigationIsLoaded(includingEntity, navigation); } } else { NavigationExtensions.SetIsLoadedWhenNoTracking(navigation, includingEntity); if (relatedEntity != null) { fixup(includingEntity, relatedEntity); if (inverseNavigation != null && !inverseNavigation.IsCollection) { NavigationExtensions.SetIsLoadedWhenNoTracking(inverseNavigation, relatedEntity); } } } } }