2010-08-29 3 views
0

J'ai requête simple HQL.colonnes de sortie NHibernate/projections de CreateQuery() liste()

var list = OpenSession() 
       .CreateQuery("SELECT MAX(p.price) as max_price, 
            COUNT(p.id) as count_all 
          FROM Order o left join o.Products p") 
       .List(); 

je voudrais sortie "max_price" et "count_all" colonnes/projections aussi facile que possible.

Quelque chose comme:

Console.WriteLine(list[0]["max_price"]); 
Console.WriteLine(list[0]["count_all]); 

Toute idée?

Répondre

3

Vous pouvez le transformer Hashtable

.SetResultTransformer(Transformers.AliasToEntityMap).List<HashTable>()[0]["max_price"]; 
+0

Donc j'ai besoin de créer une classe spéciale avec des projections d'abord? (AliasToEntityMap ??) – knagode

+0

@knagode: Non, AliasToEntityMap est un transformateur intégré; pas besoin de faire quelque chose de spécial. – DanP

+0

Super! Avant d'avoir une erreur: Le nom 'AliasToEntityMap' n'existe pas dans le contexte actuel. J'ai dû le changer en: .SetResultTransformer (NHibernate.Transform.Transformers.AliasToEntityMap) – knagode

1

Je ne suis pas sûr de cela, mais je pense que vous aurez besoin de créer une classe et un projet. Voilà comment je commencerais en l'approchant

class UserStatistics{ 
MaxPrice {get; set;} 
CountAll {get; set;} 
} 

var list = OpenSession() 
       .CreateQuery("SELECT MAX(p.price) as max_price, 
            COUNT(p.id) as count_all 
          FROM Order o left join o.Products p") 
       .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(UserStatistics))) 
       .List<UserStatistics>(); 

alors il devrait être une question de

Console.WriteLine(list[0].MaxPrice); 
Console.WriteLine(list[0].CountAll); 

Great Post explaining better.

+0

Aussi je nécessaire pour ajouter: .SetResultTransformer (NHibernate.Transform .Transformers.AliasToBean (typeof (UserStatistics))); – knagode

+0

a ajouté SetResultTransformer pour répondre. également inclus un lien vers un post expliquant mieux. –

Questions connexes