NHibernate QueryOver Сумма в JoinQueryOver - PullRequest
6 голосов
/ 16 июня 2011

Хотя я читал «Поваренную книгу NHibernate» и все доступные посты на форуме вверх и вниз, я все еще не смог выполнить этот простой запрос:

У меня есть пользователи, у каждого из которых есть одна учетная запись.У каждого аккаунта есть баланс.Классы выглядят так:

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

Теперь я хотел бы суммировать баланс всех активных пользователей.Ничего больше ... В простом SQL это довольно просто:

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

У меня нет никаких идей, как я могу решить эту проблему с новым QueryOver-Api от NHibernate 3. Не могли бы вы предоставитьпример кода?

Заранее спасибо!

Даниэль Ланг

EDIT Я знаю, что с NHibernate Linq это тоже очень просто, но я бы хотел решить эту проблему с помощью QueryOver ... Вот рабочий пример Linq:

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

РЕШЕНИЕ Благодаря AlexCuse я смог найти окончательное решение (он был очень очень близок) - вот полный код:

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>()

Ответы [ 2 ]

9 голосов
/ 16 июня 2011

Вы пробовали что-то подобное?

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

Я не уверен, что эквивалент UniqueResult есть в API QueryOver, поэтому пришлось пройти через базовые критерии.

0 голосов
/ 27 апреля 2018

Вы написали в своем ответе:

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>()

Вам не нужно иметь псевдоним для универсального типа.Это может быть:

Account accountAlias = null;

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