« Ne pouvait pas instancier » NHibernate.QueryException Raise par combiné de requête LINQ
-
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
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