我是EF的新手并阅读了一些文章。阅读后,我对延迟加载和急切加载有什么区别感到困惑?
IQuerable
和IEnumerable
吗?请指导和帮助我。
非常感谢你的时间和指导
答案 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)
延迟加载仅在实际需要时加载相关对象,急切加载与此相反。策略的选择可能会对性能产生重大影响,例如:在您实际不需要时加载大数据集。