EF加载和延迟加载的差异?

时间:2012-06-04 08:34:25

标签: c# .net entity-framework-4

我是EF的新手并阅读了一些文章。阅读后,我对延迟加载和急切加载有什么区别感到困惑?

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

请指导和帮助我。

非常感谢你的时间和指导

3 个答案:

答案 0 :(得分:7)

关于 lazy 渴望加载之间的区别:

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

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

使用eager加载,您的发票将被立即获取并构建/填充在对象上(如果您构建了大量客户但不是真的需要所有发票,那么会引入一些不必要的性能开销在对象上可用。)

您会找到一些文档here

答案 1 :(得分:3)

  

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

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

  

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

在急切加载中,您可以控制查询是返回IQueryable还是IEnumerable。延迟加载查询发生在您的控件之外,您无法修改它。如果要对延迟加载的导航属性使用IQueryable,则必须使用名为显式加载的第三个选项,您可以对给定的导航属性进行IQueryable查询,并且可以对其进行修改。

  

两种类型的查询都可以使用Linq到实体查询语法(选择,   from,where)和lambda表达式?

没有。这些查询都没有select,from,where。延迟加载发生在您的控制之外,并且急切加载不允许过滤 - 在这两种情况下,您始终加载所有相关对象。

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

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

答案 2 :(得分:1)

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