web-dev-qa-db-ja.com

Entity Framework Code Firstにエンティティの子要素と孫要素を積極的に含めるにはどうすればよいですか?

次のように関連する3つのエンティティ(顧客、書籍、著者)を想像してください。

顧客は多くの本を持っています

本には著者が一人います

このデータを使用して、次のようなレポートを印刷します。

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

顧客に対してクエリを実行すると、予想どおり、次の性質のクエリが大量に取得されます

  1. 顧客を取得するためのクエリ
  2. 書籍を取得するための顧客ごとのクエリ
  3. 著者を取得するためのブックごとのクエリ

次のような本を含めることで、クエリの数を減らすことができます。

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

しかし、3番目のレベル(著者)を読み込む方法がわかりません。どうやってやるの?

60
adolfojp

Includeには、必要な追加プロパティへのフルパスを示すことができる文字列を受け入れるオーバーロードがあります。

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

「著者」は本のコレクションのプロパティではなく(個々の本のプロパティではなく)動作するため、奇妙に見えます。やってみて。

47
Matt Hamilton

また、文字列のオーバーロードを使用する必要はありません。このメソッドも機能します:

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

その他の例については、EFチームのブログ投稿を参照してください: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part- 6-loading-related-entities.aspx

そしてこのチュートリアル: http://www.asp.net/entity-framework/tutorials/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

141
tdykstra

ThenIncludeキーワードを使用できます:

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

3
Cyril