2012-01-04 82 views
1

我有一个非常简单的问题,但找不到一个简单的答案。单列结果NHibernate SQL查询映射

我有NHibernate的执行原始SQL查询,不幸被从数据库中加载(是的,我们存储SQL查询的数据库,没有最好的设计,但我承担)。这意味着基本上我不知道查询将返回多少列。 我知道的是,如果查询是单个列,那么它是我需要的,如果它是多个列,那么我需要第一个列,很简单。

在我的代码基本上有3种选择:

session.CreateSQLQuery(SQLString).List(); 
session.CreateSQLQuery(SQLString).List<object>(); 
session.CreateSQLQuery(SQLString).List<object[]>(); 

问题是列表()将返回一个List<int>(或合适的类型,但INT应该是在我的情况),如果该查询返回单列,或者如果我有多个列,则为List<object[]>()。在这种情况下,List<object>除外不会返回List<int>。 当然,试图总是强制转换为object [](第三选项)并获取第一个元素不起作用,因为nHibernate返回一个int并且不能转换为object []。

有没有办法强制NHibernate的始终,即使在一列的情况下返回一个对象[]?如果没有,是否有一种简单的方法来检查结果中的列数,并据此采取行动?

谢谢!

+0

可能NHibernate的DTO将满足您的需要。列表除外 Anand 2012-01-04 13:39:58

+0

如果您不知道您的查询将返回什么内容,那么您如何知道如何处理结果,或者您是否通过结果的形式决定? – 2012-01-04 14:10:38

+0

我知道我需要一个int(ID基本上)的列表。如果查询返回1列,这将是我所需要的,但如果它返回多个列,第一列将是我所需要的。然后我通过这个ID列表进行处理... 我不知道结果的类型,因为查询是由其他进程动态生成的(它基本上是一种动态过滤形式)。 – Tallmaris 2012-01-04 14:56:02

回答

3

你应该看看歧结果变压器的NHibernate提供开箱即用的(你可以编写自己也当然)。

可能适合你的情况会是什么NHibernate.Transform.ToListResultTransformer。 AFAIK,它将您的结果转换为IList,每个条目再次包含一个IList。

所以:

IList items = session 
.CreateSQLQuery(query) 
.SetResultTransformer(new NHibernate.Transform.ToListResultTransformer()) 
.List() 

if(((Ilist)items[0]).Count == 1) 
// just one columns 
else 
// more columns or zero 
+0

究竟需要什么,我实际上正在考虑写我自己的,但很高兴知道有一个预先包装的。谢谢! – Tallmaris 2012-01-04 16:29:43