NHibernate SQL Query сопоставление на результат одного столбца
У меня очень простой вопрос, но я не могу найти простой ответ.
У меня есть NHibernate, выполняющий сырой SQL-запрос, который, к сожалению, загружается из БД (да, мы храним 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 всегда возвращать объект [] даже в случае одного столбца? Если нет, есть ли простой способ проверить количество столбцов в результате и действовать соответствующим образом?
Спасибо!
1 ответ
Вам следует взглянуть на различные преобразователи результатов, которые 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