0

执行以下 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;

为什么单语句版本会引发异常?

谢谢你,

4

1 回答 1

0

第一个不起作用的原因是因为整个查询都被发送到 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

于 2011-04-08T15:16:25.747 回答