Somma di queryover nhibernate all'interno di joinqueryover
-
28-10-2019 - |
Domanda
Anche se stavo leggendo il libro di cucina NHIBERNATE e tutti i costi del forum disponibili su e giù, non sono ancora in grado di fare questa semplice domanda:
Ho utenti con tutti quelli che hanno un account. Ogni account ha un saldo. Le classi sembrano così:
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; }
}
Ora vorrei sommare l'equilibrio di tutti gli utenti attivi. Niente di più ... in semplice SQL è abbastanza facile:
SELECT SUM(a.Balance)
FROM User u
INNER JOIN Account a
ON u.Account_id = a.Id
WHERE u.Active = 'true'
Non ho idea, come potrei risolverlo con la nuova queryover-API di NHIBERNATE 3. Potresti fornire un esempio di codice?
Grazie in anticipo!
Daniel Lang
MODIFICARE
Lo so, che con Nhibernate Linq è anche molto facile, ma vorrei risolverlo usando queryover ... ecco l'esempio Linq funzionante:
var result = Session.Query<User>()
.Where(x => x.Active)
.Sum(x => x.Account.Balance)
SOLUZIONE
Grazie ad Alexcuse ho potuto trovare la soluzione finale (era molto vicino) - ecco il codice completo:
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>()
Soluzione
Hai provato qualcosa di simile?
session.QueryOver<User>(() => userAlias)
.JoinAlias(() => userAlias.Account, () => accountAlias)
.Where(() => userAlias.Active)
.Select(Projections.Sum<Account>(acct => acct.Balance))
.UnderlyingCriteria.UniqueResult()
Non sono sicuro di quale sia l'equivalente uniqueresult nell'API di queryover, quindi ho dovuto passare attraverso i criteri sottostanti.
Altri suggerimenti
Hai scritto nella tua risposta:
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>()
Non è necessario avere un alias per il tipo generico. Potrebbe essere:
Account accountAlias = null;
session.QueryOver<User>()
.JoinAlias(user => user.Account, () => accountAlias)
.Where(user => user.Active)
.Select(Projections.Sum<Account>(acct => accountAlias.Balance))
.SingleOrDefault<double>()