何時使用包含在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();

我不需要包含主題來完成這項工作,例如:

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

我什麼時候需要在實體框架中使用Include?

UPDATE

我在主題中添加了一個Byte []插圖類型的列。在我的預測中,我不包括該列,如果我使用Include,它會被加載嗎?或者永遠不會加載,除非我在投影中有它?

一般承認的答案

您不需要Include,因為您在EF上下文中工作。當您在正在創建的匿名對像中引用Theme時,不使用延遲加載,即告訴EF進行連接。

如果您返回書籍列表並且未包含主題,那麼當您嘗試獲取主題時,您會注意到它是空的。如果EF連接已打開並且您有延遲加載,它將轉到數據庫並為您抓取它。但是,如果沒有打開連接,那麼你必須明確地得到它。

另一方面,如果您使用Include,則可以立即獲得數據。在引擎蓋下,它將連接到必要的表並在那裡獲取數據。

您可以檢查EF為您生成的SQL查詢,這樣可以讓您更清楚。您將只看到一個SQL查詢。


熱門答案

如果Include子項,則會將其作為原始查詢的一部分加載,從而使其更大。

如果您不在查詢中以其他方式Include或引用子項,則初始結果集較小,但您稍後引用的每個子項將通過對數據庫的新請求延遲加載。

如果您在一個請求中循環訪問1000個用戶,然後每個請求他們的10張照片,如果您不Include孩子,您將發出1001個數據庫請求...

此外,延遲加載需要上下文尚未處理。例如,當您將實體傳遞給UI渲染視圖時,總是令人不快的驚喜。

更新以此為例,看看它是否失敗:

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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因