NHibernate IList还是列表?
我环顾了Stackoverflow,看到了一些与NHibernate IList vs List有关的问题。我有一个我自己的问题NHibernate IList还是列表?,nhibernate,ilist,Nhibernate,Ilist,我环顾了Stackoverflow,看到了一些与NHibernate IList vs List有关的问题。我有一个我自己的问题 既然IList的目的是拥有一个懒散加载的列表,那么它从存储库返回的目的是什么呢。毕竟,如果您在存储库调用中列出(),您是在创建一个确定的对象吗?因此,无论您的方法是返回IList还是列表,都不会再涉及延迟加载,对吗?如果存储库返回IQueryable,则将在您第一次枚举它时检索结果。如果对其调用ToList(),它将在此时检索结果,因为ToList将枚举IQuerya
既然IList的目的是拥有一个懒散加载的列表,那么它从存储库返回的目的是什么呢。毕竟,如果您在存储库调用中列出(),您是在创建一个确定的对象吗?因此,无论您的方法是返回IList还是列表,都不会再涉及延迟加载,对吗?如果存储库返回IQueryable,则将在您第一次枚举它时检索结果。如果对其调用ToList(),它将在此时检索结果,因为ToList将枚举IQueryable 现在,延迟加载不一定受到这种行为的影响:假设您有客户和订单。 每个客户都有一个名为CustomerOrders的属性,该属性标记为lazy loaded。这意味着,当您加载客户列表时,仅当您尝试枚举每个客户的CustomerOrders属性时,才会检索订单。
因此,如果只对GetCustomers()方法的返回值执行ToList(),它对CustomerOrders的延迟加载没有任何影响您几乎是正确的,但是混淆了一些概念,因此我将从顶部开始 您认为
.ToList()
具体化事物是正确的
IList
只是一个物化列表的抽象接口
在某些情况下,NHibernate需要IList
。使用session.QueryOver
等时,将使用List()
扩展方法返回IList
(具体化)或Future()
返回IEnumerable
(惰性)。
QueryOver
相当稳定、完整且铺砌良好
在Linq提供程序端,您可以使用session.Query
,并且您可以停留在IQueryable
级别以获得“查询规范”;IEnumerable
用于惰性项,或者IList
用于物化项。通常,您将使用ToList()
来具体化,并使用AsEnumerable()
(或强制转换/类型转换)来获得IEnumerable
。注意:关于LINQ提供商,我无法做出我在询问时所做的声明。谢谢,这不是我所确定的,但听起来确实正确。因此,不管怎样,最好养成从存储库方法返回IList的习惯?@MattB对于懒惰,您将返回IQueryable
或IEnumerable
,对于物化,IList
有很多理由。甚至没有特别的理由涉及列表
(除非在LINQ序列末尾使用'ToList()
,但即使在这种情况下,您也可能希望返回IList
以保持一致性,并隐式地向上转换结果)(是的,我知道你现在可能知道所有这些,但这个答案很容易被误解,因此我的答案…)