.net NHibernate IList列表

.net NHibernate IList列表,.net,nhibernate,remoting,.net,Nhibernate,Remoting,嗨,我正试图返回一个建筑领域的集合 private long _id; private string _buildingName; private IList<BasicRoom> _rooms; private long\u id; 私有字符串_buildingName; 私人IList_房间; 我正在使用NHibernate和这个房间映射 <bag name="rooms" table="tb_rooms" lazy="false"> <key column

嗨,我正试图返回一个建筑领域的集合

private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;
private long\u id;
私有字符串_buildingName;
私人IList_房间;
我正在使用NHibernate和这个房间映射

<bag name="rooms" table="tb_rooms" lazy="false">
<key column="buildingID"/>
<one-to-many class="Room"/>
</bag>

我这样给db打电话

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();
Buildings=(List)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc(“buildingName”)).List();
问题是我不希望_rooms集合是IList,但我需要它是一个列表。唉,NHibernate要求我为集合使用一个接口。 你知道怎么做吗。我是一个新加入.Net的人,我想也许放弃NHibernate是一条前进的道路。我只需要把收藏作为列表打印出来,这样我就可以继续了。
非常感谢您的帮助。

当您可以使用
IList做任何事情时,为什么需要一个具体的
列表
对象

如果一定要有一个具体的清单,你有两个选择

首先,只需将
IList
强制转换为
列表
。这仅在底层类型是
列表时有效,我个人对此表示怀疑

其次,对其调用ToList()扩展方法:

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>().ToList();
Buildings=(List)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc(“buildingName”)).List().ToList();

我个人建议您两者都不要,而是使用IList

使用
List
的构造函数,该构造函数接受
IEnumerable
?然后您可以使用:

Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());
Buildings=newlist(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc(“buildingName”)).List();

NHibernate不是这样工作的。您无法告诉它域模型对象的具体类型。您只需要告诉它基本类型和接口是什么。然后选择如何有效地实现域类型

例如,NHibernate使用自己的
IList
内部实现,它知道如何进行延迟加载

此外,NHibernate使用自己的内部实现从域模型构建
。与NHibernate一起使用的所有
Building
对象的具体类型不一定都是
Building
。无论
Building
是对象的具体类型,还是对象的具体类型的基本类型,它们都将是
Building
s

但这是正确的做法,因为您应该使用接口和基类型,而不是具体类型。NHibernate帮助您使用所有正确的编程方法


现在,您为什么需要一个
列表本身?为什么IList不能满足要求?

我同意,你最好还是处理这个界面。这种方式更加灵活!谢谢你的帮助。原因是,当我在更新等之后将对象发回(从ui(flex))时,网关会将对象映射回,然后将baulk at rooms作为IList。网关迫使我使用列表。仅仅通过NHibernate将数据输出到flex并返回到db是相当棘手的。如果必须的话,你必须这样做。可能使用ToList()而不是cast,以防底层类型不是List。最好的解决方案是将网关更改为采用IList(或更好的ICollection或IEnumerable)而不是具体类型。将混凝土类型的使用限制在尽可能小的范围内。谢谢。我需要映射到列表的原因是,当对象从FlexUI返回到.net时,我使用的AMF网关无法映射回IList。我通过使用DTO解决了这个问题,DTO使用列表而不是Ilist,然后根据需要进行转换。感谢。有充分的理由在IList上使用列表。例如,该列表包含更多用于构建有用谓词的功能。在我看来,有一个工具强迫你使用接口并不是“应该做的事情”。最好是让POCO独处,不要被数据提供商的尾巴所左右。如果列表和包映射对列表对象有更好的支持,我个人会喜欢它。