Я думаю, что важно понимать, как работают скомпилированные запросы в EF.
Когда вы выполняете запрос, Entity Framework будет сопоставлять дерево выражений с помощью вашего файла сопоставления (EDMX или кода, в котором сначала определены ваши модели) с запросом SQL. Это может быть сложной и ресурсоемкой задачей.
Предварительная компиляция сохраняет результаты этой фазы отображения, поэтому при следующем нажатии на запрос уже будет доступен SQL, и ему нужно будет только установить текущие параметры.
Проблема в том, что предварительно скомпилированный запрос потеряет свою производительность, как только вы измените запрос. Допустим, у вас есть следующее:
IQueryable query = GetCompiledQuery(); // => db.Tasks.Where(t => t.Id == myId);
var notModifiedResult = query.ToList(); // Fast
int ModifiedResult = query.Count(); // Slow
С первым запросом вы получите все преимущества прекомпиляции, потому что EF уже сгенерировал для вас SQL и может выполнить его немедленно.
Второй запрос потеряет прекомпиляцию, потому что он должен восстановить свой SQL.
Если вы сейчас выполните запрос на notModifiedResult
, то это будет запрос Linq To Objects, поскольку вы уже выполнили свой SQL в базу данных и извлекли все элементы в памяти.
Однако вы можете объединить скомпилированные запросы (то есть использовать скомпилированный запрос в другом скомпилированном запросе).
Но для вашего кода потребуется ряд скомпилированных запросов:
- По умолчанию
- тот, где статус! = Ноль
- та, где категория! = Ноль
- Тот, где и статус и категория! = Ноль