Ich habe eine Eltern-Kind-Tabelle-Beziehung. In einem Repository, mache ich das:EF dauert für immer, um diese Abfrage zu generieren
return (from p in _ctx.Parents
.Include("Children")
select p).AsQueryable<Parent>();
Dann in einem Filter, möchte ich durch eine Liste der untergeordneten ids die Eltern filtern:
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;
Meine Liste von IDs ist riesig. Dies erzeugt eine einfache SQL-Anweisung, die eine riesige Liste von IDs "in (1,2,3 ...)" hat, aber es braucht keine nennenswerte Zeit, um von selbst zu laufen. EF benötigt jedoch ungefähr eine volle Minute, um die Aussage zu erzeugen. Ich habe dies bewiesen, indem ich einen Haltepunkt setzte und anrief:
((ObjectQuery<Parent>)filtered).ToTraceString();
Das dauert die ganze Zeit. Ist das Problem in meiner letzten linq-Anweisung? Ich kenne keinen anderen Weg, um das Äquivalent von Child.ChildId in (ids) zu machen. Und selbst wenn meine Linq Aussage schlecht ist, wie soll das in der Welt so lange dauern?
Veröffentlichen Sie Ihr Schema und die generierte SQL, erhalten Sie möglicherweise weitere Hilfe. –
Das Schema scheint keine Rolle zu spielen, ebenso wenig wie die Eltern-Kind-Beziehung. Selbes Problem nur aus einer einzelnen Tabelle/Entity mit großer Liste auswählen. – dudeNumber4
Für alle anderen, die auf das Problem stoßen; Von allem, was ich sagen kann, gibt es keine Lösung mit EF4. Sie müssen auf gespeicherte Prozeduren zurückgreifen. Weitere Informationen: http://social.msdn.microsoft.com/Forums/en-US/adodottertentityframework/thread/d629c798-db45-4a04-9813-a3b565d87c83 – dudeNumber4