« Ne pouvait pas instancier » NHibernate.QueryException Raise par combiné de requête LINQ

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

  •  10-10-2019
  •  | 
  •  

Question

L'exécution de la déclaration suivante NHibernate.Linq soulève un NHibernate.QueryException de "could not instantiate: Reservation001.Services.ReservationDto" contenant une exception InvalidCast intérieure ( "L'objet doit mettre en œuvre IConvertible."):

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

Cependant, après la séparation ci-dessus en deux requêtes, avec ToList () appelée sur les résultats de la première, le code est exécuté très bien.

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;

Pourquoi la version unique de déclaration soulève une exception?

Merci,
Ben

Était-ce utile?

La solution

La raison pour laquelle le premier ne fonctionne pas parce que toute requête est envoyée à se NHibernate, et (comme l'exception vous dit) NHibernate attend quelque chose avec ReservationDto être IConvertible.

Le processus en deux étapes permet d'éviter cette erreur, car en appelant « ToList () » vous faire la requête à exécuter dans NHibernate immédiatement sans impliquant ReservationDto et retourner une collection d'objets. Votre deuxième étape est alors simplement sur une exploitation collection d'objets, et depuis NHibernate ne participe plus, vous éviter l'erreur.

En général, Linq utilise l'exécution différée, avec quelques fonctions (telles que ToList ()) forçant une évaluation immédiate. Voir http://devlicio.us/ blogs / derik_whittaker / archive / 2008/04/07 / LINQ-et-retardée execution.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top