2011-06-16 15 views
6

A pesar de que estaba leyendo a través del NHibernate libro de cocina y todas foro postes disponibles arriba y hacia abajo, todavía no soy capaz de obtener esta consulta simple hecho:NHibernate QueryOver Suma dentro JoinQueryOver

tengo los usuarios con todo el mundo tener una cuenta. Cada cuenta tiene un equilibrio. Las clases que se ven como:

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; } 
} 

Ahora me gustaría resumir el equilibrio de todos los usuarios activos. Nada más ... En SQL llanura es bastante fácil:

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

que no tienen ninguna idea que, cómo podría resolver que con la nueva QueryOver-Api de NHibernate 3. ¿Podrían presentar una código-ejemplo?

¡Gracias de antemano!

Daniel Lang


EDITAR
que sé, que con NHibernate LINQ es muy fácil también, pero me gustaría resolverlo utilizando QueryOver ... Aquí está el trabajo LINQ Ejemplo:

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


SOLUCIÓN
Gracias a AlexCuse que pude encontrar la solución final (estaba muy, muy cerca) - aquí está el código 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>() 

Respuesta

9

¿Has probado algo como esto?

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

No estoy seguro de lo que es el equivalente uniqueResult en la API QueryOver, así que tuvimos que ir a través de los criterios subyacentes.

+1

¡Muchas gracias! Acabas de escribir error: usa "accountAlias.Balance" en lugar de "acct.Balance". Ver mi edición arriba. ¡Los alias en cualquier lugar hicieron el truco! –

+0

Ah, eso SingleOrDefault es lo que estaba buscando. Espero poder recordarlo. Acct sorprendido. El balance no funcionaría, pero tal vez el alias prevalezca sobre lo que pase en la proyección. – AlexCuse

Cuestiones relacionadas