Отображение SQL-запроса NHibernate на результат с одним столбцом - PullRequest
1 голос
/ 04 января 2012

У меня очень простой вопрос, но я не могу найти простой ответ.

У меня есть NHibernate, выполняющий необработанный SQL-запрос, который, к сожалению, загружается из БД (да, мы храним SQL-запрос в БД, а нелучший дизайн, но терпите меня).Это означает, что в принципе я понятия не имею, сколько столбцов запрос вернет.Что я знаю, так это то, что если запрос представляет собой один столбец, то это то, что мне нужно, а если это более одного столбца, тогда мне нужен первый, достаточно простой.:

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

Проблема в том, что List () вернет либо List<int> (или соответствующий тип, но в моем случае должен быть int), если запрос возвращает один столбец, либо List<object[]>() если у меня есть несколько столбцов.То же самое касается List<object>, за исключением того, что в этом случае он не вернет List<int>.Конечно, попытка всегда привести к объекту [] (3-й вариант) и получить первый элемент не работает, так как nHibernate возвращает int, и это не может быть приведено к объекту [].

Есть ли способ заставитьnHibernate всегда возвращать объект [] даже в случае одного столбца?Если нет, то есть ли простой способ проверить количество столбцов в результате и действовать соответственно?

Спасибо!

1 Ответ

3 голосов
/ 04 января 2012

Вам следует взглянуть на различные преобразователи результатов, которые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...