Мой подход < /h1>
Код: Выделить всё
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);
}
< /code>
Этот подход нуждается в только двух запросах и не имеет избыточных данных. Я все еще счастлив, даже если 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();
< /code>
Этот генерирует только один вызов БД, но есть слишком много избыточных данных: < /p>
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
Мобильная версия