В любом случае требовать от EF Core использования двух запросов для связанных данных вместо 1 или N+1?C#

Место общения программистов C#
Ответить
Anonymous
 В любом случае требовать от EF Core использования двух запросов для связанных данных вместо 1 или N+1?

Сообщение Anonymous »

Простой сценарий категории и product (один ко многим). Категория имеет поле «Описание» , которое может быть длинным текстом. Теперь мне нужно запросить список категорий со всеми их продуктами. В явной загрузке в документации упоминаются два очевидных подхода, которые не очень хороши в моем случае (см. Ниже). < /P>
Мой подход < /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();
}
Этот подход удаляет избыточные данные, но теперь есть N+1 DB вызовы.

Подробнее здесь: https://stackoverflow.com/questions/611 ... -of-1-or-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»