К сожалению, создание запросов в Linq to Entities является довольно тяжелым ударом, но я обнаружил, что обычно это экономит время из-за возможности создавать запросы из их составных частей до фактического попадания в базу данных.
Вполне вероятно, что способ, которым они реализуют метод Contains, использует алгоритм, который предполагает, что Contains обычно используется для относительно небольшого набора данных.Согласно моим тестам, количество времени, которое требуется для каждого идентификатора в списке, начинает стремительно расти на отметке 8000.
Так что это может помочь разбить ваш запрос на части.Сгруппируйте их в группы по 1000 или менее и объедините несколько выражений Where
.
var idGroups = ids.GroupBy(i => i / 1000);
var q = Parents.Include("Children").AsQueryable();
var newQ = idGroups.Aggregate(q,
(s, g) => s.Concat(
q.Where(w => w.Children.Any(wi => g.Contains(wi.ChildId)))));
Это значительно ускоряет процесс, но этого может быть недостаточно для ваших целей, и в этом случае вы 'Придется прибегнуть к хранимой процедуре.К сожалению, этот конкретный вариант использования просто не вписывается в «коробку» ожидаемого поведения Entity Framework.Если ваш список идентификаторов может начинаться как запрос из того же контекста сущности, Entity Framework будет работать нормально.