[英]EF difference in eager loading and lazy loading?
我是EF的新手,已经阅读了一些文章。 阅读后,我对延迟加载和渴望加载之间的区别感到困惑?
IQuerable
和IEnumerable
吗? 请指导和帮助我。
非常感谢您的时间和指导
关于延迟加载和渴望加载之间的区别:
假设您有一个Customer
对象,该对象的属性为List<Invoice> Invoices
(位于另一个表中,并由Entity Framework自动加入)。
lazy
加载不会在实例化Customer对象时立即获取发票,而是仅在需要时/显式访问发票。
eager
加载,您的发票将立即被提取并构造/填充到该对象上(如果您构建了大量的客户列表,但实际上并不需要所有发票都可以在该对象上使用,这会带来不必要的性能开销)。
您可以在此处找到一些文档。
两种类型的查询都可以编译吗?
只有急切的加载才能成为手动预编译查询的一部分。 延迟加载查询由EF自动创建,并且如果它实际上是预先编译的,则它是EF内部行为。
两种查询都可以返回IQuerable和IEnumerable吗?
在急切加载中,您可以控制查询是否返回IQueryable
或IEnumerable
。 延迟加载查询发生在您的控制范围之外,您无法对其进行修改。 如果要对延迟加载的导航属性使用IQueryable
,则必须使用称为显式加载的第三个选项,在该选项中,您可以获取给定导航属性的IQueryable
查询,然后可以对其进行修改。
两种查询都可以具有Linq to实体查询语法(选择,从,哪里)和lambda表达式吗?
否。这两个查询都没有选择,从何处选择。 延迟加载发生在您的控制之外,并且急切的加载不允许过滤-在两种情况下,您始终都加载所有相关的对象。
显式查询的示例(唯一可以使用查询的加载类型):
var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
.Where(...);
延迟加载仅在实际需要时才加载相关对象,而积极加载则与此相反。 策略的选择可能会对性能产生重大影响,例如,在您实际不需要时加载大型数据集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.