我环顾了 Stackoverflow,看到了一些与 NHibernate IList vs List 相关的问题。我有一个自己的问题...
由于 IList 的目的是拥有一个延迟加载的列表,它从存储库返回的目的是什么。毕竟,如果您 ToList() 您的存储库调用,您正在创建一个确定的对象?因此,无论您的方法是返回 IList 还是 List,都不再涉及延迟加载,对吗?
我环顾了 Stackoverflow,看到了一些与 NHibernate IList vs List 相关的问题。我有一个自己的问题...
由于 IList 的目的是拥有一个延迟加载的列表,它从存储库返回的目的是什么。毕竟,如果您 ToList() 您的存储库调用,您正在创建一个确定的对象?因此,无论您的方法是返回 IList 还是 List,都不再涉及延迟加载,对吗?
如果您的存储库返回一个 IQueryable,则将在您第一次枚举它时检索结果。如果你在它上面调用 ToList(),它会在此时检索结果,因为 ToList 会枚举 IQueryable。
现在,延迟加载不一定会受到这种行为的影响:假设您有客户和订单。每个客户都有一个名为 CustomerOrders 的属性,它被标记为延迟加载。这意味着当您加载客户列表时,仅当您尝试枚举每个客户的 CustomerOrders 属性时才会检索订单。因此,如果您只是对 GetCustomers() 方法的返回值执行 ToList(),它对 CustomerOrders 的延迟加载没有影响
您非常正确,但是混淆了一些概念,因此我将从顶部开始。
你说得对.ToList()
materializes
。
IList
只是物化列表的抽象接口。
NHibernateIList
在某些情况下需要,因为它代理了一些东西。使用session.QueryOver
etc. 时,您将使用List()
扩展方法返回一个IList
(物化)或Future()
返回一个IEnumerable
(惰性)。这QueryOver
是相当稳定和完整的和铺好的。
在 Linq 提供者方面,您可以使用session.Query
,并且您可以停留在IQueryable
级别以拥有“查询规范”,IEnumerable
用于惰性或IList
物化项目。通常,您将使用ToList()
物化和AsEnumerable()
(或强制转换/类型转换)来获取IEnumerable
. 注意,我无法就 LINQ 提供程序在 QueryOver 上发表声明。