2009-08-17 4 views
0

Ich habe etwas Code geerbt und meine aktuelle Aufgabe ist es, die Leistung zu verbessern. Sofort habe ich eine foreach-Schleife bemerkt, die faule Ladungen von Kindelementen enthält. Ich versuche, die faulen Lasten zu entfernen, da im Beispiel unten 1 + (3 * n) Aufrufe an die Datenbank gehen werden!Untergeordnete Entitäten einbeziehen, wenn ein Sproc mit Entity Framework V1 ausgeführt wird

using (BaseEntityConnection BaseEntityContext = new BaseEntityConnection()) { 
List<Parents> entities = BaseEntityContext.CallASproc(storeOrgLevelId, startDate, endDate).ToList<Parents>(); 
foreach (Parents entity in entities) 
{ 
    entity.Child1Reference.Load(); 
    entity.Child2Reference.Load(); 
    entity.Child3Reference.Load(); 
} 
} 

Meine ersten Gedanken wandte sich mit .INCLUDE(), aber ich sehe nicht, wie das möglich ist, wenn ich zunächst bin ein sproc Aufruf. (Angenommen, der Sproc kann nicht für Entitäten nach Linq verallgemeinert werden.) Ich dachte auch, dass der Tracking-Manager innerhalb des Kontexts eine Identität verwenden würde, wenn ich die untergeordneten Entitäten mit Linq zu Entities vor dem Aufruf des Sprocs geladen hätte Map ', um Entitäten zu identifizieren, die bereits geladen sind und daher herausfinden würden, dass sie nicht auf die Datenbank zugreifen müssen, wenn ich .Load() aufruft. Aber ich denke, ich muss auch .Attach() auf jeder der Kind-Referenzen aufrufen - aber das scheint klobig und ich habe es auch noch nicht funktioniert !!

Weiß jemand, wie ich den Objektgraphen für die Entitäten, die von der Sproc mit dem Minimum von Hin- und Rückreisen in die Datenbank zurückgegeben werden, laden kann?

Antwort

1

Zuerst lädt Load() immer die DB. Sie müssen es jedoch nicht aufrufen, wenn die verknüpfte Entität bereits geladen ist. Dies ist der Fall, wenn sie bereits zuvor in denselben Kontext geladen wurde. Überprüfen Sie die IsLoaded-Eigenschaft, bevor Sie Load() aufrufen.

Include funktioniert für Entitäten, die von einem SP zurückgegeben werden. Es wird JOIN in der Quelle der anderen Entitäten in SQL wie Sie "manuell" tun können. Hast du es versucht? Das heißt, es kann schneller sein, Load einige Male als JOIN zu den zugehörigen untergeordneten Entitäten aufzurufen, wenn der SP-Ergebnissatz groß ist.

Eine weitere Alternative besteht darin, in LINQ zu projizieren, anstatt Include zu verwenden. Das Ergebnis ist das gleiche, aber Sie können die Abfrage (mit CompiledQuery) vorkompilieren, wodurch die Vorbereitungszeit gespart wird. Dies kann erheblich sein, wenn Sie viele Includes haben und die Abfrage wiederholt ausführen.

+0

Danke für die Antwort. Ich habe die erste Option ausprobiert (da mit meinem derzeitigen Niveau von Entity Framework Verständnis, das ist so viel wie ich verstehe !!) und hinzugefügt (von c in Child1 wählen c) .ToList() innerhalb der 'Using Context' und auch überprüft IsLoaded vor jedem Laden, aber es ist immer noch falsch und die Load() ausgeführt wird. Ich bin mir nicht sicher, wie Sie die .Include() zu einem Sproc hinzufügen würden. Was ich dachte, ruft .Attach() mit einer Linq to Entities-Abfrage, die genau die erforderlichen Entitäten auswählt. – Phil

+0

Natürlich ist diese letzte Aussage bezüglich .Attach() Müll zu sehen, da ich das effektiv gegen die Ansammlung von Entitäten anstatt einer Entität selbst durchführen möchte :( – Phil

Verwandte Themen