执行以下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;
为什么单个语句版本会引发异常?
谢谢你,
本
答案 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