Предположим, у меня есть три таблицы: Categories, Items и CategoriesToItems
Отношение между Categories и Items много-ко-многим (через таблицу CategoriesToItems).
Предположим, чтоЯ вызываю некоторый метод, и внутри этого метода мы выполняем следующий код (чтобы немедленно выполнить запрос / перечисление данных):
var categories = context.Categories.ToList();
var items = context.Items.ToList();
var links = context.CategoriesToItems.ToList();
Сразу после этого я начинаю проверять каждый продукт следующим образом:
foreach(Category category in categories)
{
foreach(Item item in links.Select(l => l.Item))
{
//Do some stuff.
}
}
Почему эти циклы foreach генерируют запросы к базе данных?Разве EF не должна уже знать всю необходимую информацию, потому что я загрузил категории, элементы и записи таблицы ссылок?
Интересно, если я немного изменю вещи и загружу данные примерно так
var items = context.Items.ToList();
var categories = context.Categories.Include("CategoriesToItems").ToList();
Выполнение аналогичного цикла не генерирует запросы, когда я хочу узнать, какие продукты находятся в той или иной категории.
Причина, по которой меня волнует, заключается в том, что загрузка данных первым способом происходит намного быстрее,но я должен выполнить операции с данными сразу же после этого, и их производительность значительно ниже (из-за дополнительных запросов, генерируемых с каждым проходом).
Фактические предложения include более сложны, так как нам нужны данные из нескольких разных таблиц, поэтому быстрее загружать целые таблицы по отдельности, чем загружать целые таблицы посредством тщательно сгенерированного запроса множественного объединения (нам нужны вседанных, которые в них).В реальном приложении задействовано больше таблиц (категории могут иметь теги, элементы могут иметь теги, обе взаимосвязи многие-ко-многим - я уверен, вы понимаете - раздел «делать вещи» фактически создаетсловарь элементов / категорий для тегов, которые они имеют, и теги наследуются, поэтому категория, помеченная знаком X, означает, что все ее продукты помечены знаком X).
Чтобы немного обобщить / упростить это:Почему Entity Framework генерирует запросы об отношениях, когда я загружал каждую строку из всех задействованных таблиц?Могу ли я что-нибудь сделать, чтобы помочь в этой ситуации?
Редактировать: Я должен добавить, что я предполагаю, что это на самом деле вызывает базу данных из-за ADO.NETзаписи запросов, которые отображаются в LiveTrace при выполнении этих конкретных строк кода и потому, что производительность заметно отличается.Так что, если я неправильно понимаю, что означают эти записи LiveTrace, тогда я думаю, что у меня возникла другая проблема.