Когда создается запрос linq как:
var ids = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var q = from r in context.Table
where ids.Contains(r.Id)
select r;
для использования с EF генерирует T-SQL, аналогичный
SELECT ... FROM Table
WHERE Id IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 )
В общем, это то, чего я ожидаю, хотя, похоже, он портит «компиляцию плана запроса» в том смысле, что каждый запрос различен и, следовательно, должен быть скомпилирован перед выполнением.
Поскольку EF в противном случае очень хорошо использует переменные ((@ p_ linq _), чтобы избежать этого, он (по умолчанию) не делает этого для запросов такого рода.
Можно ли вообще этого избежать?
Запоминаются параметры с табличным значением, но это пока не поддерживается.
Кстати: в реальной жизни запросы намного сложнее, а количество элементов в списке идентификаторов намного больше, но все же необходимо отфильтровать данные. Мы не хотим фильтровать «клиента».