簡體   English   中英

延遲加載與急切加載

[英]Lazy Loading vs Eager Loading

在什么情況下預加載比延遲加載更有利?

實體框架中的延遲加載是加載和訪問相關實體時發生的默認現象。 但是,預加載是指強制加載所有這些關系的做法。

我問這個,因為很明顯延遲加載對資源更友好,即使我們使用ToList()方法,我們仍然可以利用延遲加載行為。

然而,我認為延遲加載可能會增加對實際數據庫的請求數量,這也許就是為什么有時開發人員使用Inlcude方法強制加載所有關系的原因。

例如,當使用 MVC 5 中的 Visual Studio 自動腳手架時,在控制器中自動創建的 Index 方法總是使用 Eager Loading,而我一直有疑問,為什么微軟在這種情況下默認使用 Eager Loading。

如果有人向我解釋在什么情況下預加載比延遲加載更有益,以及為什么我們要使用它,而有比延遲加載更資源友好的東西,我將不勝感激?

我認為這樣分類關系很好

何時使用預先加載

  1. 在一對多關系的“一側”中,您肯定會在任何地方與主要實體一起使用。 像文章的用戶屬性。 產品的類別屬性。
  2. 通常當關系不是太多並且急切加載將是減少服務器上進一步查詢的好習慣。

何時使用延遲加載

  1. 幾乎在一對多關系的每個“集合方”上。 像用戶的文章或類別的產品
  2. 您確切地知道您不會立即需要房產。

注意:如 Transcendent 所說,延遲加載可能存在處理問題。

Eager Loading: Eager Loading 可幫助您一次加載所有需要的實體。 即相關對象(子對象)與其父對象一起自動加載。

何時使用:

  1. 當關系不是太多時,使用 Eager Loading。 因此,Eager Loading 是減少服務器上進一步查詢的好方法。
  2. 當您確定將在任何地方使用主實體的相關實體時,請使用 Eager Loading。

延遲加載:延遲加載的情況下,相關對象(子對象)在被請求之前不會與其父對象一起自動加載。 默認情況下,LINQ 支持延遲加載。

何時使用:

  1. 當您使用一對多集合時,請使用延遲加載。
  2. 當您確定不會立即使用相關實體時,請使用延遲加載。

注意: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM