实体框架4延迟加载实体集
本文关键字:实体 延迟加载 框架 | 更新日期: 2023-09-27 18:14:04
我正在使用带有POCO对象的实体框架,并且我已经打开了LazyLoading。
如果我正在处理与对象关联的集合,那么该集合何时完全加载,在什么情况下加载?
如果我给每个打电话
Order.OrderItems.Count()
Order.OrderItems.Any(x => x.StatusId = aValue)
Order.OrderItems.All(x => x.StatusId = aValue)
这些是否保证OrderItems集合的完整加载?在代码中,我们称之为
Order.Include(“OrderItems”)
查询或时
context.LoadProperty(order, “OrderItems”)
查询后
但我意识到,有时这种情况并不总是发生——我想知道这种情况不发生的后果。我想我对它有点知识差距
Linq方法通常不会加载数据,直到您在其结果上添加foreach
,或附加ToList
、ToArray
等。这就是Linq-to-Entities提供程序允许您链接方法并仅在最终结构上构建查询的方式。
如果一个方法返回一个IQueryable
或IEnumerable
,那么您可以非常确定Linq在这一点上不会加载数据。
但是:
Order.OrderItems.Count()
Order.OrderItems.Any(x => x.StatusId = aValue)
Order.OrderItems.All(x => x.StatusId = aValue)
对于最外层的查询,如果Linq必须返回布尔值或整数,则它必须立即运行您的查询。但是嵌套查询的情况会变得有点复杂,因为在外部查询得到评估之前不会对其进行评估。
关于:
Order.Include("OrderItems")
我相信Include
不会单独解决查询。当您进行另一个查询时,您可以使用它来携带额外的数据。
Linq一般
如果你想知道(一般(Linq是如何工作的,你可以看看这组文章:
http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx
这将使您了解IEnumerable
何时可以延迟,以及何时必须对其进行评估。它不会告诉你关于Linq-to-Entities提供者的一切,但大部分知识会转移。
Order.OrderItems.Any(x => x.StatusId = aValue)
Order.OrderItems.All(x => x.StatusId = aValue)
是查询。
当您调用.ToList()
(或其他一些迭代器将其具体化为对象(时,将执行这些查询。若使用.Include
,则在执行查询时将填充包含的属性(查询将包含该表的联接(。使用Any
或All
(或任何类似Where
的过滤器扩展(只会添加where条件(可以来自另一个表(,但不会将OrderItems放入sql-select中,因此除非使用.Include
,否则不会加载它们。
--
与您的问题无关,但如果您对此很熟悉,并且有分页功能,请记住在调用ToList
(执行查询(之前将Skip
和Take
添加到您的查询中,我见过有人很早就调用ToList
,并在进行分页之前将整个表读取到内存中。