0

次の NHibernate.Linq ステートメントを実行すると"could not instantiate: Reservation001.Services.ReservationDto"、内部 InvalidCast 例外 (「オブジェクトは IConvertible を実装する必要があります。」) を含む NHibernate.QueryException が発生します。

var inOneStep = (from r in session.Linq<Models.ReservationHeader>()
    select new ReservationDto(r.Current));
return inOneStep;

ただし、上記を 2 つのクエリに分割し、最初のクエリの結果に対して 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()」を呼び出すことにより、 ReservationDtoを使用せずに、NHibernateでクエリをすぐに実行し、オブジェクトコレクションを返すため、2ステップのプロセスでこのエラーを回避できます。次に、2番目のステップは単にオブジェクトコレクションを操作することです。NHibernateは関与しなくなったため、エラーを回避できます。

一般に、Linqは遅延実行を使用し、いくつかの関数(ToList()など)で即時評価を強制します。http://devlicio.us/blogs/derik_whittaker/archive/2008/04/07/linq-and-delayed-execution.aspxを参照してください

于 2011-04-08T15:16:25.747 に答える