webentwicklung-frage-antwort-db.com.de

Wie kann ich die untergeordneten und Enkelelemente einer Entität zuerst in den Entity Framework Code aufnehmen?

Stellen Sie sich drei Entitäten (Kunde, Buch, Autor) vor, die wie folgt zusammenhängen:

Ein Kunde hat viele Bücher

Ein Buch hat einen Autor

Ich verwende diese Daten, um einen Bericht wie folgt zu drucken:

Customer: Peter
  Book: To Kill a Mockingbird - Author: Harper Lee
  Book: A Tale of Two Cities - Author: Charles Dickens
Customer: Melanie
  Book: The Hobbit - Author: J. R. R. Tolkien

Wenn ich nach Kunden frage, erhalte ich erwartungsgemäß eine Reihe von Anfragen der folgenden Art

  1. Eine Abfrage, um die Kunden zu erhalten
  2. Eine Anfrage pro Kunde, um seine Bücher zu erhalten
  3. Eine Abfrage pro Buch, um den Autor zu erhalten

Ich kann die Anzahl der Abfragen reduzieren, indem ich die Bücher so einbinde:

var customers = db.Customers.Include (c => c.Books);

Aber ich weiß nicht, wie ich die dritte Ebene laden soll (Author). Wie kann ich das machen?

56
adolfojp

Es gibt eine Überladung für Include, die eine Zeichenfolge akzeptiert, die den vollständigen Pfad zu zusätzlichen Eigenschaften angibt, die Sie benötigen:

var customers = db.Customers.Include("Books.Author");

Es sieht seltsam aus, weil "Author" keine Eigenschaft in einer Sammlung von Büchern ist (eher eine Eigenschaft in jedem einzelnen Buch), aber es funktioniert. Mach einen Wirbel.

45
Matt Hamilton

Es ist auch nicht notwendig, die Stringüberladung zu verwenden. Diese Methode wird auch funktionieren:

var customers = db.Customers.Include(c => c.Books.Select(b => b.Author));

Weitere Beispiele finden Sie im Blog-Beitrag des EF-Teams: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part -6-ladebezogene Entitäten.aspx

Und dieses Tutorial: http://www.asp.net/entity-framework/tutorials/reading-related-daten-mit-the-entity-framework-in-an-aspaspnet-mvc-application

136
tdykstra

Sie können das Schlüsselwort ThenInclude verwenden:

var customers = db.Customers.Include(c => c.Books).ThenInclude(book => book.Author));}

3
Cyril