Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate IList还是列表?_Nhibernate_Ilist - Fatal编程技术网

NHibernate IList还是列表?

NHibernate IList还是列表?,nhibernate,ilist,Nhibernate,Ilist,我环顾了Stackoverflow,看到了一些与NHibernate IList vs List有关的问题。我有一个我自己的问题 既然IList的目的是拥有一个懒散加载的列表,那么它从存储库返回的目的是什么呢。毕竟,如果您在存储库调用中列出(),您是在创建一个确定的对象吗?因此,无论您的方法是返回IList还是列表,都不会再涉及延迟加载,对吗?如果存储库返回IQueryable,则将在您第一次枚举它时检索结果。如果对其调用ToList(),它将在此时检索结果,因为ToList将枚举IQuerya

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


既然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
以保持一致性,并隐式地向上转换结果)(是的,我知道你现在可能知道所有这些,但这个答案很容易被误解,因此我的答案…)