У меня есть отношение родительского и дочернего таблиц. В репозитории я делаю это:
return (from p in _ctx.Parents
.Include( "Children" )
select p).AsQueryable<Parent>();
Затем в фильтре я хочу отфильтровать родителя по списку дочерних идентификаторов:
IQueryable<Parent> qry; // from above
List<int> ids; // huge list (8500)
var filtered =
from p in qry.Where( p => p.Children.Any(c => ids.Contains(c.ChildId)) ) select s;
Мой список идентификаторов огромен. Это создает простой оператор SQL, который имеет огромный список идентификаторов "в (1,2,3...)", но не требуется заметного времени для запуска самостоятельно. EF, однако, занимает целую минуту, чтобы сгенерировать выражение. Я доказал это, установив точку останова и вызвав:
((ObjectQuery<Parent>)filtered).ToTraceString();
Это занимает все время. Является ли проблема в моей последней формулировке linq? Я не знаю другого способа сделать эквивалент Child.ChildId в (ids). И даже если мое выражение linq плохое, как в мире это должно пройти так долго?