“Impossibile creare un'istanza” Raise NHibernate.QueryException By Combined LINQ Query

StackOverflow https://stackoverflow.com/questions/3998247

  •  10-10-2019
  •  | 
  •  

Domanda

L'esecuzione della seguente dichiarazione NHibernate.Linq solleva una NHibernate.QueryException "could not instantiate: Reservation001.Services.ReservationDto" contenente un'eccezione InvalidCast interno ( "oggetto deve implementare IConvertible."):

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

Tuttavia, dopo aver diviso la sopra in due query, con ToList () ha invitato i risultati della prima, l'esegue codice multa.

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;

Perché la versione singola istruzione sollevare un'eccezione?

Grazie,
Ben

È stato utile?

Soluzione

La ragione per cui il primo non funziona è perché tutta la query viene sempre inviato a NHibernate, e (come l'eccezione vi dice) NHibernate si aspetta qualcosa con ReservationDto essere IConvertible.

Il processo in due fasi consente di evitare questo errore, perché chiamando "ToList ()" si causa la query da eseguire in NHibernate immediatamente senza che coinvolge ReservationDto, e restituendo una collezione oggetto. Il secondo passo è poi semplicemente operando su una collezione di oggetti, e dal momento che NHibernate non è più coinvolto, è evitare l'errore.

In generale, Linq usa esecuzione ritardata, con alcune funzioni (come ToList ()) costringendo valutazione immediata. Vedere http://devlicio.us/ blog / derik_whittaker / archive / 2008/04/07 / LINQ e ritardato-execution.aspx-

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top