2012-06-04 39 views
1

我是新来的EF和阅读一些文章。阅读后,我很困惑,懒惰加载和急切加载有什么区别?急于加载和延迟加载的EF差异?

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

请亲引导和帮助我。

非常感谢您的时间和指导

+0

可能重复。 com/questions/3230508 /延迟加载延迟加载和急切加载在实体框架) –

+0

我想在你的查询中使用'.Include'使其立即加载,也许你可以通过使用它来控制 – V4Vendetta

回答

3

这两种查询都可以编译?

只有预先加载可以是手动预编译查询的一部分。惰性加载查询由EF自动创建,如果它实际预先编译它,它就是EF内部行为。

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

在预先加载中,您可以控制查询是否返回IQueryableIEnumerable。延迟加载查询发生在您的控制之外,您无法对其进行修改。如果您想要使用IQueryable进行延迟加载的导航属性,则必须使用第三个选项,即显式加载,您可以从中获取指定导航属性的IQueryable查询,并且可以对其进行修改。

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

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

实例(唯一类型的加载,你可以使用查询)://计算器:延迟加载,延迟加载和预先加载的实体框架(HTTP的

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

关于渴望装载的区别:

假设你有一个Customer物体有一个属性List<Invoice> Invoices(这是在不同的表并由实体框架自动加入)。

使用lazy加载发票时,您的Customer对象实例化时不会立即提取,但仅当您需要它/明确访问它时。

随着eager加载您的发票将被立即提取和构造/填充对象(如果您构建了一个巨大的客户列表,但并不真的需要所有的发票都可以在目的)。

你会发现一些文件here

+3

+1准确地说,这意味着 - 如果你不小心 - 你可能遇到N + 1问题:你得到'Customer'对象,然后你想遍历'Invoices'。这意味着您将为客户拨打1个电话,N将拨打所有发票,因为他们是一个接一个提取的。这就是当你在原始查询中包含'Invoices'以便在一次数据库调用中急切地获取它们的时候。 –

1

延迟加载只是在实际需要时加载相关对象,热切加载与此相反。策略的选择可能会对性能产生重大影响,例如当你不需要它时加载一个大数据集。