2012-06-04 40 views
1

我是新來的EF和閱讀一些文章。閱讀後,我很困惑,懶惰加載和急切加載有什麼區別?急於加載和延遲加載的EF差異?

  • 這兩種查詢都可以編譯?
  • 這兩種查詢都可以返回IQuerableIEnumerable
  • 這兩種查詢都可以使用Linq to Entities查詢syntex(select,from,where)和lambda表達式嗎?

請親引導和幫助我。

非常感謝您的時間和指導

+0

可能重複。 com/questions/3230508 /延遲加載延遲加載和急切加載在實體框架) –

+0

我想在你的查詢中使用'.Include'使其立即加載,也許你可以通過使用它來控制 – V4Vendetta

回答

3

這兩種查詢都可以編譯?

只有預先加載可以是手動預編譯查詢的一部分。惰性加載查詢由EF自動創建,如果它實際預先編譯它,它就是EF內部行爲。

這兩種查詢都可以返回IQuerable和IEnumerable嗎?

在預先加載中,您可以控制查詢是否返回IQueryableIEnumerable。延遲加載查詢發生在您的控制之外,您無法對其進行修改。如果您想要使用IQueryable進行延遲加載的導航屬性,則必須使用第三個選項,即顯式加載,您可以從中獲取指定導航屬性的IQueryable查詢,並且可以對其進行修改。

這兩種查詢都可以使用Linq實體查詢語法(選擇, from,where)和lambda表達式?

否這些查詢都沒有select,from,where。延遲加載發生在您的控制之外,並且預先加載不允許過濾 - 在這兩種情況下,您都會加載所有相關的對象。明確查詢

實例(唯一類型的加載,你可以使用查詢)://計算器:延遲加載,延遲加載和預先加載的實體框架(HTTP的

var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery() 
                 .Where(...); 
7

關於渴望裝載的區別:

假設你有一個Customer物體有一個屬性List<Invoice> Invoices(這是在不同的表並由實體框架自動加入)。

使用lazy加載發票時,您的Customer對象實例化時不會立即提取,但僅當您需要它/明確訪問它時。

隨着eager加載您的發票將被立即提取和構造/填充對象(如果您構建了一個巨大的客戶列表,但並不真的需要所有的發票都可以在目的)。

你會發現一些文件here

+3

+1準確地說,這意味着 - 如果你不小心 - 你可能遇到N + 1問題:你得到'Customer'對象,然後你想遍歷'Invoices'。這意味着您將爲客戶撥打1個電話,N將撥打所有發票,因爲他們是一個接一個提取的。這就是當你在原始查詢中包含'Invoices'以便在一次數據庫調用中急切地獲取它們的時候。 –

1

延遲加載只是在實際需要時加載相關對象,熱切加載與此相反。策略的選擇可能會對性能產生重大影響,例如當你不需要它時加載一個大數據集。