“无法实例化”NHibernate.QueryException通过组合Linq查询提升

时间:2010-10-22 15:16:08

标签: linq nhibernate iconvertible

执行以下NHibernate.Linq语句会引发一个"could not instantiate: Reservation001.Services.ReservationDto" NHibernate.QueryException,其中包含一个内部InvalidCast异常(“Object必须实现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 :(得分: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