Исключение недействительной передачи из Int32 в DateTime — но где?

#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>()