"не удалось создать экземпляр" NHibernate.QueryException Raise By Combined Linq Query - PullRequest
0 голосов
/ 22 октября 2010

Выполнение следующей инструкции 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 Ответ

0 голосов
/ 08 апреля 2011

Причина, по которой первый не работает, заключается в том, что весь запрос отправляется в 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

...