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>()
È stato utile?

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>() 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top