"не удалось создать экземпляр" 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