我有一个非常简单的问题,但找不到简单的答案。
我让NHibernate执行原始SQL查询,遗憾的是从DB加载(是的,我们在数据库中存储SQL查询,而不是最好的设计,但请耐心等待)。这意味着基本上我不知道查询将返回多少列。 我所知道的是,如果查询是单个列,那么它就是我需要的,如果它是多个列,那么我需要第一个,这很容易。
在我的代码中,我基本上有3个选项:
session.CreateSQLQuery(SQLString).List();
session.CreateSQLQuery(SQLString).List<object>();
session.CreateSQLQuery(SQLString).List<object[]>();
问题是,如果查询返回单个列,List()将返回List<int>
(或适当的类型,但int应该是我的情况),如果我返回List<object[]>()
有多列。 List<object>
也是如此,但在这种情况下它不会返回List<int>
。
当然试图总是强制转换为object [](第3个选项)并获取第一个元素不起作用,因为nHibernate返回一个int并且不能转换为object []。
有没有办法强制nHibernate总是返回一个对象[],即使在单列的情况下?如果没有,是否有一种简单的方法来检查结果中的列数并采取相应的行动?
谢谢!
答案 0 :(得分: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