我查看了Stackoverflow并看到了几个与NHibernate IList vs List相关的问题。我有自己的问题......
由于IList的目的是拥有一个延迟加载列表,它的目的是从存储库返回。毕竟如果ToList()你的存储库调用,你正在创建一个确定的对象?因此,无论您的方法是返回IList还是List,都不再涉及延迟加载,对吗?
答案 0 :(得分:3)
如果您的存储库返回IQueryable,则会在您首次枚举时检索结果。如果你在它上面调用ToList(),它将在此时检索结果,因为ToList将枚举IQueryable。
现在,延迟加载不一定受此行为的影响:假设您有客户和订单。 每个客户都有一个名为CustomerOrders的属性,该属性标记为延迟加载。这意味着当您加载客户列表时,仅当您尝试枚举每个客户的CustomerOrders属性时才会检索订单。 因此,如果您只对GetCustomers()方法的返回值执行ToList(),则它对延迟加载CustomerOrders没有影响
答案 1 :(得分:3)
你非常正确,但是会让一些概念混乱,所以我会把它从顶部拿走。
.ToList()
materializes
件事你是对的。
IList
只是物化列表的抽象接口。
NHibernate在某些情况下需要IList
because it proxies things。使用session.QueryOver
等时,您将使用List()
扩展方法返回IList
(已实现)或Future()
以返回IEnumerable
(懒惰)。
QueryOver
相当稳定,完整且铺好。
在Linq提供商方面,您使用session.Query
,并且可以保持IQueryable
级别以获得查询的规范,IEnumerable
对于物化项目的懒惰或IList
。通常,您将使用ToList()
来实现,并AsEnumerable()
(或演员/类型转化)来IEnumerable
。注意:我无法发表关于LINQ提供程序的QueryOver声明。