我是新来的EF和阅读一些文章。阅读后,我很困惑,懒惰加载和急切加载有什么区别?急于加载和延迟加载的EF差异?
- 这两种查询都可以编译?
- 这两种查询都可以返回
IQuerable
和IEnumerable
? - 这两种查询都可以使用Linq to Entities查询syntex(select,from,where)和lambda表达式吗?
请亲引导和帮助我。
非常感谢您的时间和指导
我是新来的EF和阅读一些文章。阅读后,我很困惑,懒惰加载和急切加载有什么区别?急于加载和延迟加载的EF差异?
IQuerable
和IEnumerable
?请亲引导和帮助我。
非常感谢您的时间和指导
这两种查询都可以编译?
只有预先加载可以是手动预编译查询的一部分。惰性加载查询由EF自动创建,如果它实际预先编译它,它就是EF内部行为。
这两种查询都可以返回IQuerable和IEnumerable吗?
在预先加载中,您可以控制查询是否返回IQueryable
或IEnumerable
。延迟加载查询发生在您的控制之外,您无法对其进行修改。如果您想要使用IQueryable
进行延迟加载的导航属性,则必须使用第三个选项,即显式加载,您可以从中获取指定导航属性的IQueryable
查询,并且可以对其进行修改。
这两种查询都可以使用Linq实体查询语法(选择, from,where)和lambda表达式?
否这些查询都没有select,from,where。延迟加载发生在您的控制之外,并且预先加载不允许过滤 - 在这两种情况下,您都会加载所有相关的对象。明确查询
实例(唯一类型的加载,你可以使用查询)://计算器:延迟加载,延迟加载和预先加载的实体框架(HTTP的
var query = ((EntityCollection<MyEntity>)parent.Children).CreateSourceQuery()
.Where(...);
关于懒和渴望装载的区别:
假设你有一个Customer
物体有一个属性List<Invoice> Invoices
(这是在不同的表并由实体框架自动加入)。
使用lazy
加载发票时,您的Customer对象实例化时不会立即提取,但仅当您需要它/明确访问它时。
随着eager
加载您的发票将被立即提取和构造/填充对象(如果您构建了一个巨大的客户列表,但并不真的需要所有的发票都可以在目的)。
你会发现一些文件here。
+1准确地说,这意味着 - 如果你不小心 - 你可能遇到N + 1问题:你得到'Customer'对象,然后你想遍历'Invoices'。这意味着您将为客户拨打1个电话,N将拨打所有发票,因为他们是一个接一个提取的。这就是当你在原始查询中包含'Invoices'以便在一次数据库调用中急切地获取它们的时候。 –
延迟加载只是在实际需要时加载相关对象,热切加载与此相反。策略的选择可能会对性能产生重大影响,例如当你不需要它时加载一个大数据集。
可能重复。 com/questions/3230508 /延迟加载延迟加载和急切加载在实体框架) –
我想在你的查询中使用'.Include'使其立即加载,也许你可以通过使用它来控制 – V4Vendetta