[英]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.