2009-12-29 10 views
0

Je tente de convertir la requête NHibernate suivante en utilisant l'instanciation dyanmic dans un IList < t> plutôt qu'un IList.Fusion d'un IList en IList <t> en utilisant l'instanciation dynamique

IList<AllName> allNames = 
    (IList<AllName>)Session.CreateQuery(
    @"select new AllName(
    name.NameId, name.FirstName, origin.OriginId, origin.Description, 
    name.Sex, name.Description, name.SoundEx 
) from Name name join name.Origin origin") 
    .SetFirstResult(skip) 
    .SetMaxResults(pageSize); 

L'exécution de ce que j'obtiens l'erreur suivante: -

Unable to cast object of type 'NHibernate.Impl.QueryImpl' to type 'System.Collections.Generic.IList`1[Domain.Model.Entities.AllName]'.

Je sais que je peux retourner

IList results = Sesssion.CreateQuery(... 

mais mes couches de service attendent un

IList<AllName> 

Comment puis-je y parvenir?

Répondre

5

Une option consisterait à écrire une implémentation IList<T> qui est représentée par un IList, le cas échéant. Cela ne devrait pas être trop difficile à faire, bien que quelque peu fastidieux. LINQ rendra cela un peu plus facile en termes d'implémentation de IEnumerable<T> etc - vous pouvez simplement appeler l'itérateur sous-jacent et appeler le Cast<T>(), par exemple.

Une autre solution serait de créer une nouvelle List<T> de la liste renvoyée:

IList query = Session.CreateQuery(...); 
IList<AllName> allNames = new List<AllName>(query.Cast<AllName>()); 

EDIT: Comme Sander si souligne à juste titre, voici ce ToList est pour:

IList query = Session.CreateQuery(...); 
return query.Cast<AllName>().ToList(); 

EDIT: Tout cela a été NHibernate agnostique, pour ainsi dire - je ne sais pas vraiment beaucoup sur NHibernate. Rippo a maintenant trouvé une réponse beaucoup plus simple - appelez plutôt List<AllName> (qui est une méthode NHibernate).

+3

Lorsque vous utilisez la méthode d'extension '.Cast ()', vous pouvez tout aussi bien ajouter un '.ToList()'. –

+1

Merci Jon, la distribution a travaillé. Y a-t-il une sorte de performance frappée ici? Le format de ma page est défini sur 50 enregistrements. Je ne renvoie donc pas une quantité énorme de données. – Rippo

+0

@sander: doh! Pourquoi pas. Je pense à ça? :) –