[英]Lazy Loading vs Eager Loading
在什么情況下預加載比延遲加載更有利?
實體框架中的延遲加載是加載和訪問相關實體時發生的默認現象。 但是,預加載是指強制加載所有這些關系的做法。
我問這個,因為很明顯延遲加載對資源更友好,即使我們使用ToList()
方法,我們仍然可以利用延遲加載行為。
然而,我認為延遲加載可能會增加對實際數據庫的請求數量,這也許就是為什么有時開發人員使用Inlcude
方法強制加載所有關系的原因。
例如,當使用 MVC 5 中的 Visual Studio 自動腳手架時,在控制器中自動創建的 Index 方法總是使用 Eager Loading,而我一直有疑問,為什么微軟在這種情況下默認使用 Eager Loading。
如果有人向我解釋在什么情況下預加載比延遲加載更有益,以及為什么我們要使用它,而有比延遲加載更資源友好的東西,我將不勝感激?
我認為這樣分類關系很好
何時使用預先加載
何時使用延遲加載
注意:如 Transcendent 所說,延遲加載可能存在處理問題。
Eager Loading: Eager Loading 可幫助您一次加載所有需要的實體。 即相關對象(子對象)與其父對象一起自動加載。
何時使用:
延遲加載:在延遲加載的情況下,相關對象(子對象)在被請求之前不會與其父對象一起自動加載。 默認情況下,LINQ 支持延遲加載。
何時使用:
注意:Entity Framework 支持三種加載相關數據的方式——預先加載、延遲加載和顯式加載。
延遲加載會產生多個 SQL 調用,而快速加載可能會通過一個“更重”的調用(使用連接/子查詢)加載數據。
例如,如果您的 web 和 sql 服務器之間的 ping 很高,您將使用 Eager 加載,而不是使用延遲加載 1 對 1 加載相關項目。
考慮以下情況
public class Person{
public String Name{get; set;}
public String Email {get; set;}
public virtual Employer employer {get; set;}
}
public List<EF.Person> GetPerson(){
using(EF.DbEntities db = new EF.DbEntities()){
return db.Person.ToList();
}
}
現在調用此方法后,您不能再延遲加載Employer
實體。 為什么? 因為db
對象已被釋放。 所以你必須做Person.Include(x=> x.employer)
來強制加載它。
Eager Loading當您確定要一次獲取多個實體時,例如您必須在同一頁面上顯示用戶和用戶詳細信息,那么您應該使用預先加載。 Eager loading 對數據庫進行一次點擊並加載相關實體。
延遲加載當您必須僅在頁面上顯示用戶,並且通過單擊用戶需要顯示用戶詳細信息時,您需要使用延遲加載。 延遲加載進行多次點擊,以便在綁定/迭代相關實體時加載相關實體。
延遲加載- 在處理分頁時非常有用,例如在頁面加載列表中顯示包含 10 個用戶的用戶,並且當用戶向下滾動頁面時,API 調用會帶來接下來的 10 個用戶。 當您不想一次加載整個數據時,這很好,因為這會花費更多時間並且會給用戶帶來糟糕的體驗。
急切加載- 當沒有太多關系並在一次調用數據庫時一次獲取整個數據時,就像其他人建議的那樣好
最好盡可能使用預先加載,因為它可以優化應用程序的性能。
前任-:
Eager loading
var customers= _context.customers.Include(c=> c.membershipType).Tolist();
lazy loading
在模型中客戶必須定義
Public virtual string membershipType {get; set;}
因此,在查詢延遲加載時,加載所有引用對象的速度要慢得多,但急切加載查詢並僅選擇相關的對象。
從 SEO 的角度來看,延遲加載有助於在您加載圖像之前保留資源,從而有助於縮短加載時間,因此通常用於提高網站加載速度。
但是,有時這會導致 Google 的“First Contentful Paint”(FCP) 指標出現延遲,因此建議對橫幅圖像和“首屏”內容使用 loading='eager'。 特別是在主頁上。
// Using LINQ and just referencing p.Employer will lazy load
// I am not at a computer but I know I have lazy loaded in one
// query with a single query call like below.
List<Person> persons = new List<Person>();
using(MyDbContext dbContext = new MyDbContext())
{
persons = (
from p in dbcontext.Persons
select new Person{
Name = p.Name,
Email = p.Email,
Employer = p.Employer
}).ToList();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.