3

我环顾了 Stackoverflow,看到了一些与 NHibernate IList vs List 相关的问题。我有一个自己的问题...

由于 IList 的目的是拥有一个延迟加载的列表,它从存储库返回的目的是什么。毕竟,如果您 ToList() 您的存储库调用,您正在创建一个确定的对象?因此,无论您的方法是返回 IList 还是 List,都不再涉及延迟加载,对吗?

4

2 回答 2

3

如果您的存储库返回一个 IQueryable,则将在您第一次枚举它时检索结果。如果你在它上面调用 ToList(),它会在此时检索结果,因为 ToList 会枚举 IQueryable。

现在,延迟加载不一定会受到这种行为的影响:假设您有客户和订单。每个客户都有一个名为 CustomerOrders 的属性,它被标记为延迟加载。这意味着当您加载客户列表时,仅当您尝试枚举每个客户的 CustomerOrders 属性时才会检索订单。因此,如果您只是对 GetCustomers() 方法的返回值执行 ToList(),它对 CustomerOrders 的延迟加载没有影响

于 2012-08-24T12:27:57.037 回答
3

您非常正确,但是混淆了一些概念,因此我将从顶部开始。

你说得对.ToList() materializes

IList只是物化列表的抽象接口。

NHibernateIList在某些情况下需要,因为它代理了一些东西。使用session.QueryOveretc. 时,您将使用List()扩展方法返回一个IList(物化)或Future()返回一个IEnumerable(惰性)。这QueryOver是相当稳定和完整的和铺好的。

在 Linq 提供者方面,您可以使用session.Query,并且您可以停留在IQueryable级别以拥有“查询规范”,IEnumerable用于惰性或IList物化项目。通常,您将使用ToList()物化和AsEnumerable()(或强制转换/类型转换)来获取IEnumerable. 注意,我无法就 LINQ 提供程序在 QueryOver 上发表声明。

于 2016-04-05T16:05:30.463 回答