Мой подход
Код: Выделить всё
var categories = await dc.Categories
.AsNoTracking()
.ToListAsync();
var catDict = categories.ToDictionary(q => q.Id);
var catIds = catDict.Keys;
var products = await dc.Products
.Where(q => catIds.Contains(q.CategoryId))
.ToListAsync();
foreach (var product in products)
{
// Category.Products is initialized with empty List already
catDict[product.CategoryId].Products.Add(product);
}
Есть ли какой-либо метод/команда/запрос в EF Core который просит его запрашивать связанные данные таким образом?
Это должно быть похоже на явную загрузку, но если есть метод, который можно применить к списку объектов:
Код: Выделить всё
await context.Collection(categories) // instead of context.Entry(...) for a single entity
.Collection(b => b.Products)
.LoadAsync();
1 подход к запросу
Код: Выделить всё
var categories = await dc.Categories
.AsNoTracking()
.Include(q => q.Products)
.ToListAsync();

Подход N+1 запросов
Код: Выделить всё
var categories = await dc.Categories
.AsNoTracking()
.ToListAsync();
foreach (var category in categories)
{
category.Products = await dc.Products
.Where(q => q.CategoryId == category.Id)
.ToListAsync();
}
Подробнее здесь: https://stackoverflow.com/questions/611 ... -of-1-or-n
Мобильная версия