执行以下NHIBERNATE.LINQ语句提出了一个 "could not instantiate: Reservation001.Services.ReservationDto" nhibernate.queryException包含内部无效的异常(“对象必须实现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;

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

谢谢,

有帮助吗?

解决方案

第一个不起作用的原因是因为整个查询都被发送到nhibernate,并且(如例外告诉您)Nhibernate期望与ReservationDto具有可爱的东西。

两个步骤过程避免了此错误,因为通过调用“ tolist()”,您会立即在NHIBERNATE中执行查询 没有 涉及ReservationDto,并返回对象集合。然后,您的第二步是简单地在对象集合上操作,并且由于不再涉及NHIBERNATE,因此您避免了错误。

通常,LINQ使用延迟执行,其中一些功能(例如Tolist())迫使立即评估。看 http://devlicio.us/blogs/derik_whittaker/archive/2008/04/07/linq-and-delayed-execution.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top