NHibernate IList to List

时间:2009-01-30 02:50:10

标签: .net nhibernate remoting

您好我正在尝试返回构建域的集合。

private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;

我正在使用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>();

问题是我不希望_rooms集合成为IList,但我需要它作为List。唉,NHibernate要求我为集合使用Interface。 知道如何做到这一点。我是.Net的新手,并认为可能放弃NHibernate可能是前进的方向。我只需要将集合输入为List,这样我就可以继续了。 任何帮助非常感谢。

3 个答案:

答案 0 :(得分:12)

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

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

此外,NHibernate在您的域模型中使用自己的Building内部实现。不一定是您将与NHibernate一起使用的所有Building对象都具有Building作为其具体类型。只有Building是对象的具体类型,或者它是否是对象的具体类型的基本类型,它们才是Building s。

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

现在,为什么你需要一个List<Building>?为什么IList<Building>不够?

答案 1 :(得分:5)

为什么你需要一个具体的List对象,当你可以用IList做你想做的一切?

如果绝对必须是具体列表,您有两种选择。

首先,只需将IList<Building>转换为List<Building>即可。这只有在基础类型 List<Building>时才有效,我个人对此表示怀疑。

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

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

我个人建议您不要这样做,而是使用IList。

答案 2 :(得分:2)

使用List<T>的{​​{1}}构造函数怎么样?然后你可以使用:

IEnumerable<T>
相关问题