2010-10-22 3 views
0

L'exécution de la déclaration suivante NHibernate.Linq soulève un "could not instantiate: Reservation001.Services.ReservationDto" NHibernate.QueryException contenant une exception InvalidCast intérieure ("L'objet doit mettre en œuvre IConvertible."):"ne pouvait pas instancier" NHibernate.QueryException Raise par combiné de requête LINQ

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

Cependant, après avoir scindé ce qui précède en deux requêtes, ToList() a appelé les résultats du premier, le code s'exécute correctement.

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 à instruction unique déclenche-t-elle une exception?

Merci,
Ben

Répondre

0

La raison pour laquelle le premier ne fonctionne pas parce que toute requête s'envoyé à NHibernate, et (comme l'exception vous dit) NHibernate attend quelque chose avec ReservationDto être IConvertible . Le processus en deux étapes évite cette erreur car, en appelant "ToList()", la requête s'exécute immédiatement dans NHibernate sans impliquant ReservationDto et renvoyant une collection d'objets. Votre deuxième étape fonctionne alors simplement sur une collection d'objets, et comme NHibernate n'est plus impliqué, vous évitez 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-and-delayed-execution.aspx

+0

Dans le premier exemple, pourquoi ReservationDto doit être convertible? Est-ce une limitation de l'implémentation Linq de NHibernate? –

+1

@Ben Gribaudo - L'exception cast/IConvertible semble très probablement être une incompatibilité de type dans les fichiers de mapping, mais c'est difficile à dire à coup sûr. Voir par exemple: http://davidchristiansen.com/archive/2005/04/01/27953.aspx, http://forums.asp.net/t/1627881.aspx, https://forums.hibernate.org/ viewtopic.php? p = 2302650 & sid = ff2dcb4c955af1b6eb7a29727402e2bd, https://forum.hibernate.org/viewtopic.php?f=25&t=990532&start=0 Selon les circonstances, vous pouvez simplement corriger les correspondances ou, le cas échéant, les implémenter IConvertible. – Nathan

Questions connexes