Влияет ли порядок включения () при фильтрации на производительность? - PullRequest
0 голосов
/ 11 октября 2018

Это работает нормально, и я предполагаю, что загружает все сущности со всеми дочерними элементами Foo и Bar, а затем фильтрует результаты на основе значения Foo:

var baz = "sillystring";
context.Entities
       .Include(e => e.Foo)
       .Include(e => e.Bar)
       .Where(e.Foo == baz)
       .Select(e.Bar)
       .ToList();

Такесли это так, является ли это полезной оптимизацией, когда сначала выполняется фильтрация, а затем Bar дочерние элементы включаются только для подмножества сущностей?

var baz = "sillystring";
context.Entities
       .Include(e => e.Foo)
       .Where(e.Foo == baz)
       .Include(e => e.Bar) // moved to after the filter
       .Select(e.Bar)
       .ToList();

... также достаточно ли у EF умныйзнаете, что когда я использую .Select(e.Bar), что Bar должно быть включено?

1 Ответ

0 голосов
/ 11 октября 2018

Правда в том, что это действительно не имеет значения в этом случае, потому что оба Includes игнорируются.Вы можете удалить их, и запрос выдаст точно такой же SQL и результат.

Это потому, что Include действуют только при применении к корневому объекту результата запроса (если есть).Это означает, что они игнорируются для проекционных (Select) запросов в анонимные / DTO / ViewModel и т. Д. Типы.Рассматриваются только запросы, возвращающие непосредственно типы сущностей, и, как я уже говорил, если Include s начинаются с этого типа сущности.

Многие люди неправильно понимают назначение Include s.Они вообще не нужны для правильного функционирования запросов, которые используют свойства навигации для фильтрации, упорядочения, группировки, выбора и т. Д. Все их назначение - Загрузка связанных сущностей .

В вашем примереединственными допустимыми включениями будут свойства навигации Bar, и они должны быть вставлены после Select(e => e.Bar).Их порядок не имеет значения, а также операторы LINQ между Select и Include, так как они не меняют тип результата запроса.

...