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
Другие вопросы по тегам