2009-06-12 7 views
3

würde Ich mag einen strukturierteren Ansatz zu schaffen, um die benötigte Einheit Baum Laden:Eager Loading Aggregat Wurzeln mit Entity Framework

ich eine schwere Menge an Daten benötigen, so tue ich dies mit typsichere Inklusive (nur ein normales Include aber mit Lambdas) as shown here.

Wie gesagt, ich brauche eine Menge Daten, im Grunde eine ganze Entität Baum unter 1 Elternteil.

Nun, ich könnte diese etwas zu tun, tun:

context.House 
    .Include(x => x.Doors) 
    .Include(x => x.Doors.FirstOrDefault().Joint) 
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory) 
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory.JointType) 
    .Include(x => x.Windows) 
    // ... same thing 
    .Include(x => x.Roof) 
    // ... same thing 

Wie Sie sehen können, diese Zeile gefüllt mit umfasst, kann ziemlich umfangreich erhalten. Dies ist in der Tat ein sehr vereinfachtes Beispiel des tatsächlichen Code (die Häuser nicht enthält übrigens)

Also was ich möchte, ist Methoden erstellen, verantwortlich für seine Branche in der Struktur. Wenn die Methode die Objektabfrage akzeptieren und das Kind einschließen kann, ruft sie ihrerseits die "chub-loader-Methoden" auf. Außerdem sollte das Elternelement keine Rolle spielen, solange es eine Eigenschaft mit dem Typ des Kindes hat.

Dies ist wahrscheinlich nicht viel Sinn machen, so:

public void LoadHouse(int id) 
{ 
    // ... 
    ObjectQuery<House> query = context.House; 

    // and now? 
    LoadDoors(query, x => x.Door); 

} 

public void LoadDoors<T>(ObjectQuery<T> query, ..?..) 
{ 
    // ... ? 

    LoadJoints(...) 


} 

Und so weiter. Aber ich kann es nicht wirklich verstehen ... Es gibt eine fehlende Verbindung zwischen der eingehenden Anfrage und dem Aufruf der Kind-Methoden.

Hat jemand so etwas getan? Oder könnte mir jemand ein paar Hinweise geben?

Antwort

2

Probieren Sie etwas wie dieses stattdessen:

query = LoadDoors (Abfrage, x => x.Door);

Wo LoadX das Ergebnis des Aufrufs Include zurückgibt.

+0

Ich verstehe nicht die Notwendigkeit, den Ausdruck an die LoadDoors-Methode übergeben, sicherlich kennt die LoadDoors-Methode diesen Ausdruck? –

+1

Ich sehe auch nicht, wie die Änderung von void zur Rückfrage eine Lösung ist. Afterall, die Abfrage kommt in byref, also was auch immer ich dazu in der Methode mache, wird getan. – Bertvan

+0

@Bertvan weil ReferenceEquals (q, q.Include ("Foo")) == falsch –