单列结果上的NHibernate SQL查询映射

单列结果上的NHibernate SQL查询映射,nhibernate,Nhibernate,我有一个非常简单的问题,但找不到简单的答案 我让NHibernate执行一个原始SQL查询,不幸的是,它是从DB加载的(是的,我们将SQL查询存储在DB中,这不是最好的设计,但请注意)。这意味着基本上我不知道查询将返回多少列。 我所知道的是,如果查询是一个单列,那么它就是我所需要的,如果它是多个列,那么我需要第一个,非常简单 在我的代码中,我基本上有3个选项: session.CreateSQLQuery(SQLString).List(); session.CreateSQLQuery(SQL

我有一个非常简单的问题,但找不到简单的答案

我让NHibernate执行一个原始SQL查询,不幸的是,它是从DB加载的(是的,我们将SQL查询存储在DB中,这不是最好的设计,但请注意)。这意味着基本上我不知道查询将返回多少列。 我所知道的是,如果查询是一个单列,那么它就是我所需要的,如果它是多个列,那么我需要第一个,非常简单

在我的代码中,我基本上有3个选项:

session.CreateSQLQuery(SQLString).List();
session.CreateSQLQuery(SQLString).List<object>();
session.CreateSQLQuery(SQLString).List<object[]>();
session.CreateSQLQuery(SQLString.List();
CreateSQLQuery(SQLString.List();
CreateSQLQuery(SQLString.List();
问题是,如果查询返回单个列,List()将返回
List
(或适当的类型,但在我的情况下int应该是),如果我有多个列,List()将返回
List()
List
也是如此,只是在这种情况下它不会返回
List
。 当然,尝试始终强制转换到对象[](第三个选项)并获取第一个元素是行不通的,因为nHibernate返回一个int,而该int不能强制转换到对象[]

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


谢谢

您应该看看NHibernate提供的不同结果(当然,您也可以自己编写)

适合您情况的是
NHibernate.Transform.ToListResultTransformer
。好的,它将您的结果转换为IList,其中每个条目再次包含一个IList

因此:


也许NHibernate DTO可以满足您的需求。除了列表如果您不知道查询将返回什么,那么您如何知道如何处理结果,或者您是根据结果的形状来决定的?我知道我需要一个int(id)列表。如果查询返回1列,它将是我需要的,但是如果它返回多个列,第一列将是我需要的。然后我将此ID列表传递到要处理的位置。。。我不知道结果的类型,因为查询是由其他进程动态生成的(它基本上是一种动态过滤形式)。正是需要的,我实际上正在考虑编写自己的结果,但很高兴知道有一个预打包的结果。谢谢
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