我是新來的EF和閱讀一些文章。閱讀後,我很困惑,懶惰加載和急切加載有什麼區別?急於加載和延遲加載的EF差異?
- 這兩種查詢都可以編譯?
- 這兩種查詢都可以返回
IQuerable
和IEnumerable
? - 這兩種查詢都可以使用Linq to Entities查詢syntex(select,from,where)和lambda表達式嗎?
請親引導和幫助我。
非常感謝您的時間和指導
我是新來的EF和閱讀一些文章。閱讀後,我很困惑,懶惰加載和急切加載有什麼區別?急於加載和延遲加載的EF差異?
IQuerable
和IEnumerable
?請親引導和幫助我。
非常感謝您的時間和指導
這兩種查詢都可以編譯?
只有預先加載可以是手動預編譯查詢的一部分。惰性加載查詢由EF自動創建,如果它實際預先編譯它,它就是EF內部行爲。
這兩種查詢都可以返回IQuerable和IEnumerable嗎?
在預先加載中,您可以控制查詢是否返回IQueryable
或IEnumerable
。延遲加載查詢發生在您的控制之外,您無法對其進行修改。如果您想要使用IQueryable
進行延遲加載的導航屬性,則必須使用第三個選項,即顯式加載,您可以從中獲取指定導航屬性的IQueryable
查詢,並且可以對其進行修改。
這兩種查詢都可以使用Linq實體查詢語法(選擇, from,where)和lambda表達式?
否這些查詢都沒有select,from,where。延遲加載發生在您的控制之外,並且預先加載不允許過濾 - 在這兩種情況下,您都會加載所有相關的對象。明確查詢
實例(唯一類型的加載,你可以使用查詢)://計算器:延遲加載,延遲加載和預先加載的實體框架(HTTP的
var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
.Where(...);
關於懶和渴望裝載的區別:
假設你有一個Customer
物體有一個屬性List<Invoice> Invoices
(這是在不同的表並由實體框架自動加入)。
使用lazy
加載發票時,您的Customer對象實例化時不會立即提取,但僅當您需要它/明確訪問它時。
隨着eager
加載您的發票將被立即提取和構造/填充對象(如果您構建了一個巨大的客戶列表,但並不真的需要所有的發票都可以在目的)。
你會發現一些文件here。
+1準確地說,這意味着 - 如果你不小心 - 你可能遇到N + 1問題:你得到'Customer'對象,然後你想遍歷'Invoices'。這意味着您將爲客戶撥打1個電話,N將撥打所有發票,因爲他們是一個接一個提取的。這就是當你在原始查詢中包含'Invoices'以便在一次數據庫調用中急切地獲取它們的時候。 –
延遲加載只是在實際需要時加載相關對象,熱切加載與此相反。策略的選擇可能會對性能產生重大影響,例如當你不需要它時加載一個大數據集。
可能重複。 com/questions/3230508 /延遲加載延遲加載和急切加載在實體框架) –
我想在你的查詢中使用'.Include'使其立即加載,也許你可以通過使用它來控制 – V4Vendetta