Mam relacji tabela nadrzędny podrzędność. W repozytorium, to robię:EF na zawsze generuje to zapytanie
return (from p in _ctx.Parents
.Include("Children")
select p).AsQueryable<Parent>();
Następnie w filtrze, chcę filtrować rodzica przez listę identyfikatorów podrzędnych:
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;
Moja lista identyfikatorów jest ogromna. Generuje to prostą instrukcję SQL, która ma ogromną listę identyfikatorów "w (1,2,3 ...)", ale samo uruchomienie nie zajmuje znaczącego czasu. EF jednak zajmuje około minuty, aby wygenerować wyciąg. Udowodniłem to, ustawiając punkt przerwania i dzwoniąc pod numer:
((ObjectQuery<Parent>)filtered).ToTraceString();
Zajmuje to cały czas. Czy problem występuje w moim ostatnim wyciągu linq? Nie znam innego sposobu na zrobienie odpowiednika Child.ChildId in (ids). I nawet jeśli moja instrukcja linq jest zła, jak na świecie powinno to potrwać tak długo?
Opublikuj swój schemat i wygenerowany sql, możesz uzyskać dodatkową pomoc. –
Schemat nie ma znaczenia, podobnie jak relacja rodzic/dziecko. Ten sam problem polega na wybraniu pojedynczej tabeli/obiektu z dużą listą. – dudeNumber4
Dla każdego, kto ma problem; ze wszystkiego, co mogę powiedzieć, nie ma rozwiązania z EF4. Musisz uciekać się do procedur przechowywanych. Więcej informacji: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d629c798-db45-4a04-9813-a3b565d87c83 – dudeNumber4