Ho una relazione tabella padre-figlio. In un repository, sto facendo questo:EF prende sempre per generare questa query
return (from p in _ctx.Parents
.Include("Children")
select p).AsQueryable<Parent>();
Poi in un filtro, voglio filtrare il genitore da un elenco di ID figlio:
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;
mio elenco di ID è enorme. Questo genera una semplice istruzione SQL che ha un enorme elenco di ID "in (1,2,3 ...)", ma non ci vuole tempo apprezzabile per funzionare da solo. EF, tuttavia, impiega un minuto intero solo per generare la dichiarazione. Ho provato questo impostando un breakpoint e chiamando:
((ObjectQuery<Parent>)filtered).ToTraceString();
Questo richiede tutto il tempo. Il problema è nella mia ultima dichiarazione di linq? Non conosco altro modo per fare l'equivalente di Child.ChildId in (id). E anche se la mia affermazione di linq è negativa, come mai nel mondo ci vorrà così tanto tempo?
Posta lo schema e lo sql generato, potresti ricevere ulteriore assistenza. –
Lo schema non sembra avere importanza, né la relazione genitore/figlio. Stesso problema selezionando solo da una singola tabella/entità con una lista grande. – dudeNumber4
Per chiunque si trovi di fronte al problema; da tutto ciò che posso dire, non c'è soluzione con EF4. È necessario ricorrere alle procedure memorizzate. Maggiori informazioni: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d629c798-db45-4a04-9813-a3b565d87c83 – dudeNumber4