#c# #nhibernate
#c# #nhibernate
Вопрос:
Я использую следующий необработанный SQL-код через NHibernate, и я не могу найти больше примеров кода для сравнения, но он выдает исключение InvalidCastException (от Int32 до DateTime)
var query = session.CreateSQLQuery("SELECT COUNT(*), MIN(Created), MAX(Created)"
" FROM MyStuff WHERE Created < :deadline")
.SetDateTime("deadline", deadline)
.UniqueResult();
Теперь я почти уверен, что крайний срок на самом деле имеет тип DateTime (очевидно, метод даже не будет принимать какой-либо другой тип), и, насколько я понимаю, я не навязываю тип результату, так откуда же берется это преобразование?
Комментарии:
1. Какой запрос выполняется на стороне sql? Попробуйте проверить это с помощью профилировщика.
Ответ №1:
Всякий раз, когда мы хотим, чтобы NHibernate загружал данные из БД, мы должны думать о последующей обработке результатов. В основном, сглаживание, чтобы правильно определить, какое значение из набора записей (DB) принадлежит какому значению в наборе результатов (C #).
Итак, эта простая настройка «КАК псевдоним» — это путь:
var query = session
.CreateSQLQuery("SELECT COUNT(*) AS Count, "
" MIN(Created) AS MinDate, "
" MAX(Created) AS MaxDate "
" FROM MyStuff WHERE Created < :deadline")
.SetDateTime("deadline", deadline)
;
var result = query
.UniqueResult<object[]>()
;
var count = (int) result[0];
var minDate = (DateTime)result[1];
var maxDate = (DateTime)result[2];
Как только мы это сделали, мы можем сделать это еще проще, используя DTO
public class ResultDto
{
public virtual int Count { get; set; }
public virtual DateTime MinDate { get; set; }
public virtual DateTime MaxDate { get; set; }
}
Оператор результата:
var result = query
.SetResultTransformer(Transformers.AliasToBean<ResultDto>())
.UniqueResult<ResultDto>()