繁体   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