实体框架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”) 

查询后

但我意识到,有时这种情况并不总是发生——我想知道这种情况不发生的后果。我想我对它有点知识差距

实体框架4延迟加载实体集

Linq方法通常不会加载数据,直到您在其结果上添加foreach,或附加ToListToArray等。这就是Linq-to-Entities提供程序允许您链接方法并仅在最终结构上构建查询的方式。

如果一个方法返回一个IQueryableIEnumerable,那么您可以非常确定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,则在执行查询时将填充包含的属性(查询将包含该表的联接(。使用AnyAll(或任何类似Where的过滤器扩展(只会添加where条件(可以来自另一个表(,但不会将OrderItems放入sql-select中,因此除非使用.Include,否则不会加载它们。

--

与您的问题无关,但如果您对此很熟悉,并且有分页功能,请记住在调用ToList(执行查询(之前将SkipTake添加到您的查询中,我见过有人很早就调用ToList,并在进行分页之前将整个表读取到内存中。