繁体   English   中英

EF渴望加载和延迟加载的区别?

[英]EF difference in eager loading and lazy loading?

我是EF的新手,已经阅读了一些文章。 阅读后,我对延迟加载和渴望加载之间的区别感到困惑?

  • 两种类型的查询都可以编译吗?
  • 两种查询都可以返回IQuerableIEnumerable吗?
  • 两种类型的查询都可以具有Linq to Entities查询语法(选择,从,哪里)和lambda表达式吗?

请指导和帮助我。

非常感谢您的时间和指导

关于延迟加载和渴望加载之间的区别:

假设您有一个Customer对象,该对象的属性为List<Invoice> Invoices (位于另一个表中,并由Entity Framework自动加入)。

lazy加载不会在实例化Customer对象时立即获取发票,而是仅在需要时/显式访问发票。

eager加载,您的发票将立即被提取并构造/填充到该对象上(如果您构建了大量的客户列表,但实际上并不需要所有发票都可以在该对象上使用,这会带来不必要的性能开销)。

您可以在此处找到一些文档。

两种类型的查询都可以编译吗?

只有急切的加载才能成为手动预编译查询的一部分。 延迟加载查询由EF自动创建,并且如果它实际上是预先编译的,则它是EF内部行为。

两种查询都可以返回IQuerable和IEnumerable吗?

在急切加载中,您可以控制查询是否返回IQueryableIEnumerable 延迟加载查询发生在您的控制范围之外,您无法对其进行修改。 如果要对延迟加载的导航属性使用IQueryable ,则必须使用称为显式加载的第三个选项,在该选项中,您可以获取给定导航属性的IQueryable查询,然后可以对其进行修改。

两种查询都可以具有Linq to实体查询语法(选择,从,哪里)和lambda表达式吗?

否。这两个查询都没有选择,从何处选择。 延迟加载发生在您的控制之外,并且急切的加载不允许过滤-在两种情况下,您始终都加载所有相关的对象。

显式查询的示例(唯一可以使用查询的加载类型):

var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
                                                         .Where(...);

延迟加载仅在实际需要时才加载相关对象,而积极加载则与此相反。 策略的选择可能会对性能产生重大影响,例如,在您实际不需要时加载大型数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM