"не удалось создать экземпляр" NHibernate.QueryException Raise By Combined Linq Query

Выполнение следующего оператора NHibernate.Linq вызывает "could not instantiate: Reservation001.Services.ReservationDto" NHibernate.QueryException, содержащий внутреннее исключение InvalidCast ("Объект должен реализовывать IConvertible."):

var inOneStep = (from r in session.Linq<Models.ReservationHeader>()
    select new ReservationDto(r.Current));
return inOneStep;

Однако после разбиения вышеупомянутого на два запроса, с ToList(), вызванным на результаты первого, код выполняется нормально.

var step1 = (from r in session.Linq<Models.ReservationHeader>()
     select r).ToList();
var step2 = from z in step1
     select new ReservationDto(z.Current);
return step2;

Почему версия с одним оператором вызывает исключение?

Спасибо,
Бен

1 ответ

Решение

Причина, по которой первый не работает, заключается в том, что весь запрос отправляется в NHibernate, и (как говорит исключение) NHibernate ожидает, что что-то с ReservationDto будет IConvertible.

Двухэтапный процесс позволяет избежать этой ошибки, потому что, вызывая "ToList()", вы заставляете запрос немедленно выполняться в NHibernate без привлечения ReservationDto и возврата коллекции объектов. Тогда вторым шагом будет просто работа с коллекцией объектов, и, поскольку NHibernate больше не задействован, вы избежите ошибки.

В общем, Linq использует отложенное выполнение с несколькими функциями (такими как ToList()), которые вызывают немедленную оценку. См. http://devlicio.us/blogs/derik_whittaker/archive/2008/04/07/linq-and-delayed-execution.aspx

Другие вопросы по тегам