いつEFにインクルードを使用するのですか?投影には不要ですか?

entity-framework entity-framework-core

質問

Entity Framework Coreには次のようなものがあります。

public class Book {
  public Int32 Id { get; set; }
  public String Title { get; set; }
  public virtual Theme Theme { get; set; }
}

public class Theme {
  public Int32 Id { get; set; }
  public String Name { get; set; }
  public Byte[] Illustration { get; set; }
  public virtual ICollection<Ebook> Ebooks { get; set; }
}

私は次のlinqクエリを持っています:

List<BookModel> books = await context.Books.Select(x =>
  new BookModel {
    Id = x.Id,
    Name = x.Name,
    Theme = new ThemeModel {
      Id = x.Theme.Id,
      Name = x.Theme.Name
    }
   }).ToListAsync();

私はこの作品を作るためにTheme含める必要はありませんでした。

List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ...

Entity Frameworkでインクルードを使用する必要はいつですか?

更新

私はByte []イラストレーションの列をテーマに追加しました。私の計画では、その列を含めないので、Includeを使用するとロードされますか?私はそれを投影しなければ、決してロードされませんか?

受け入れられた回答

あなたはEFの文脈の中で働いていたので、Includeは必要ありませんでした。作成している匿名オブジェクトの中でThemeを参照すると、それは遅延読み込みを使用していないため、EFに結合を指示しています。

あなたが本のリストを返し、あなたがテーマを含んでいない場合、あなたがテーマを取得しようとすると、それはnullであることに気付くでしょう。 EF接続が開いていて、遅延ロードがある場合は、DBに移動して取得します。しかし、接続が開かれていない場合は、明示的に取得する必要があります。

一方、インクルードを使用すると、すぐにデータが取得されます。フードの下でそれは必要なテーブルへのジョインを行い、そこにデータを取得します。

あなたはEFが生成しているSQLクエリをチェックすることができます。これにより、より明快なものになります。 1つのSQLクエリしか表示されません。


人気のある回答

子をIncludeすると、元のクエリの一部としてロードされ、元のクエリが大きくなります。

クエリで他の方法で子をIncludeまたは参照していない場合、最初の結果セットは小さくなりますが、後で参照する各子は新しい要求によってデータベースに遅延ロードされます。

1つのリクエストで1000人のユーザーをループした後、それぞれの10個の写真を尋ねると、子をIncludeないと1001のデータベース要求が行われInclude ...

また、レイジーローディングでは、コンテキストが破棄されていないことが必要です。たとえば、UIレンダリングのビューにエンティティを渡すときは、常に不愉快な驚きです。

update例えばこれを試してみてください。それが失敗するのを見てください:

var book = await context.Books.First();
var theme = book.Theme;

次に、これを試してください:

var book = await context.Books.Include(b => b.Theme).First();
var theme = book.Theme;


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow