NHibernate IList还是列表?

时间:2012-08-24 12:15:04

标签: nhibernate ilist

我查看了Stackoverflow并看到了几个与NHibernate IList vs List相关的问题。我有自己的问题......

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

2 个答案:

答案 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声明。