2011-06-16 3 views
6

Bien que je lisais le livre de recettes NHibernate et tous FORUM- postes disponibles haut et en bas, je ne suis toujours pas en mesure d'obtenir cette requête simple fait:NHibernate QueryOver Somme au sein JoinQueryOver

je les utilisateurs avec tout le monde ayant un Compte. Chaque compte a un solde. Les classes ressemblent que:

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual Account Account { get; set; } 
    public virtual bool Active { get; set; } 
} 

public class Account 
{ 
    public virtual int Id { get; set; } 
    public virtual double Balance { get; set; } 
} 

Maintenant, je voudrais résumer l'équilibre de tous les utilisateurs actifs. Rien de plus ... en SQL il est assez facile:

SELECT SUM(a.Balance) 
FROM User u 
INNER JOIN Account a 
ON u.Account_id = a.Id 
WHERE u.Active = 'true' 

Je n'ai aucune idée moi, comment je pouvais résoudre que le nouveau QueryOver-Api de NHibernate 3. Pourriez-vous s'il vous plaît fournir un code-exemple?

Merci d'avance!

Daniel Lang


EDIT
Je sais qu'avec NHibernate Linq il est très facile aussi, mais je voudrais le résoudre en utilisant QueryOver ... Voici le LINQ Exemple de travail:

var result = Session.Query<User>() 
         .Where(x => x.Active) 
         .Sum(x => x.Account.Balance) 


SOLUTION
Merci à AlexCuse je pouvais trouver la solution finale (il était très proche) - voici le code complet:

User userAlias = null; 
Account accountAlias = null; 

session.QueryOver<User>(() => userAlias) 
    .JoinAlias(() => userAlias.Account,() => accountAlias) 
    .Where(() => userAlias.Active) 
    .Select(Projections.Sum<Account>(acct => accountAlias.Balance)) 
    .SingleOrDefault<double>() 

Répondre

9

Avez-vous essayé quelque chose comme ça?

session.QueryOver<User>(() => userAlias) 
    .JoinAlias(() => userAlias.Account,() => accountAlias) 
    .Where(() => userAlias.Active) 
    .Select(Projections.Sum<Account>(acct => acct.Balance)) 
    .UnderlyingCriteria.UniqueResult() 

Je ne suis pas sûr de ce que l'équivalent uniqueResult est dans l'API QueryOver, et il fallait passer par les critères sous-jacents.

+1

Merci beaucoup! Vous avez juste tapé là - utilisez "accountAlias.Balance" au lieu de "acct.Balance". Voir ma modification ci-dessus. Les alias de n'importe où ont fait l'affaire! –

+0

Ah, ce SingleOrDefault est ce que je cherchais. J'espère pouvoir m'en souvenir. Un acct.Balance surpris ne fonctionnerait pas mais peut-être que l'alias l'emporte sur ce qui est passé dans la projection. – AlexCuse