“无法实例化”NHibernate.QueryException由组合Linq查询引发

“无法实例化”NHibernate.QueryException由组合Linq查询引发,linq,nhibernate,iconvertible,Linq,Nhibernate,Iconvertible,执行以下NHibernate.Linq语句会引发无法实例化的错误:Reservation001.Services.ReservationDto NHibernate.QueryException包含内部InvalidCast异常对象必须实现IConvertible: var inOneStep = (from r in session.Linq<Models.ReservationHeader>() select new ReservationDto(r.Current));

执行以下NHibernate.Linq语句会引发无法实例化的错误: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;
为什么单语句版本会引发异常

谢谢,,
Ben

第一个查询不起作用的原因是,整个查询都被发送到了NHibernate,并且正如异常告诉您的那样,NHibernate希望reservationd中的某些内容是IConvertible的

两个步骤的过程避免了这个错误,因为通过调用ToList,可以使查询立即在NHibernate中执行,而不涉及ReservationDto,并返回一个对象集合。第二步是简单地操作对象集合,因为不再涉及NHibernate,所以可以避免错误


通常,Linq使用延迟执行,一些函数(如ToList)强制立即求值。请参见第一个示例中的

,为什么ReservationDto需要可转换?这是NHibernate的Linq实现的一个限制吗?@Ben Gribaudo-cast/IConvertible异常似乎最有可能是映射文件中的类型不匹配,但很难确定。例如,请参见:,,根据您的情况,您可以简单地更正映射,或者在适当的情况下实际实现IConvertible。