2008-09-15 9 views
2

Si j'ai une requête simple nom défini, les préformes une fonction de comptage, sur une colonne:NHibernate, Somme Interrogation

<query name="Activity.GetAllMiles"> 
    <![CDATA[ 
     select sum(Distance) from Activity 
    ]]> 

    </query> 

Comment puis-je obtenir le résultat d'une somme ou une requête DonT retour d'une les entités mappées, avec NHibernate utilisant soit IQuery soit ICriteria?

Voici ma tentative (je suis incapable de le tester maintenant), cela fonctionnerait-il?

public decimal Find(String namedQuery) 
    { 
     using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      IQuery query = session.GetNamedQuery(namedQuery); 


      return query.UniqueResult<decimal>(); 
     } 
    } 

Répondre

2

Désolé! Je voulais en fait une somme, pas un compte, ce qui explique beaucoup. Iv modifié le message en conséquence

Cela fonctionne très bien:

var criteria = session.CreateCriteria(typeof(Activity)) 
          .SetProjection(Projections.Sum("Distance")); 
    return (double)criteria.UniqueResult(); 

L'approche de la requête nommée meurt encore, "Les erreurs dans les requêtes nommées: {Activity.GetAllMiles}":

using (ISession session = NHibernateHelper.OpenSession()) 
      { 
       IQuery query = session.GetNamedQuery("Activity.GetAllMiles"); 


       return query.UniqueResult<double>(); 
      } 
4

Comme réponse indirecte à votre question, voici comment je le fais sans une requête nommée.

var session = GetSession(); 
    var criteria = session.CreateCriteria(typeof(Order)) 
      .Add(Restrictions.Eq("Product", product)) 
      .SetProjection(Projections.CountDistinct("Price")); 
    return (int) criteria.UniqueResult(); 
0

Je pense que dans votre exemple original, vous avez juste besoin de query.UniqueResult(); le nombre retournera un nombre entier.