1

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

  • 可以编译这两种类型的查询吗?
  • 两种类型的查询都可以返回IQuerableIEnumerable
  • 两种类型的查询都可以有 Linq to Entities 查询语法(select、from、where)和 lambda 表达式吗?

请指导和帮助我。

非常感谢您的时间和指导

4

3 回答 3

7

关于延迟加载和急切加载的区别:

假设您有一个Customer具有属性的对象List<Invoice> Invoices(位于不同的表中并由实体框架自动连接)。

lazy您的客户对象被实例化时,加载发票不会立即被提取,但只有当您需要它/明确地访问它时。

加载后,eager您的发票将立即被提取并构造/填充到对象上(如果您构建大量客户列表但并不真正需要所有发票都可以在对象上随时可用,则会引入一些不必要的性能开销)。

您会在此处找到一些文档。

于 2012-06-04T08:38:01.120 回答
3

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

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

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

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

两种类型的查询都可以有 Linq 到实体查询语法(选择、从、哪里)和 lambda 表达式吗?

不,这些查询都没有选择、来自、在哪里。延迟加载超出了您的控制范围,并且急切加载不允许过滤 - 在这两种情况下,您总是会加载所有相关对象。

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

var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
                                                         .Where(...);
于 2012-06-04T08:48:16.863 回答
1

延迟加载只是在实际需要的时候加载相关的对象,而急切加载则相反。策略的选择可能会对性能产生很大影响,例如,当您实际上不需要时加载大数据集。

于 2012-06-04T08:38:44.730 回答