6

虽然我正在阅读 NHibernate Cookbook 和所有可用的论坛帖子,但我仍然无法完成这个简单的查询:

我有用户,每个人都有一个帐户。每个帐户都有一个余额。这些类看起来像这样:

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'

我不知道如何使用 NHibernate 3 中的新 QueryOver-Api 来解决这个问题。您能否提供一个代码示例?

先感谢您!

丹尼尔·朗


编辑
我知道,使用 NHibernate Linq 也很容易,但我想使用 QueryOver 解决它......这是工作的 Linq 示例:

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


SOLUTION
Thanks to AlexCuse I could find the final solution (he was very very close) - here is the full code:

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

2 回答 2

9

Have you tried something like this?

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

I'm not sure what the UniqueResult equivalent is in the QueryOver API, so had to go through the underlying criteria.

于 2011-06-16T16:39:34.273 回答
0

You wrote in your answer:

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

You don't need to have an alias for the generic type. It could be:

Account accountAlias = null;

session.QueryOver<User>()
    .JoinAlias(user => user.Account, () => accountAlias)
    .Where(user => user.Active)
    .Select(Projections.Sum<Account>(acct => accountAlias.Balance))
    .SingleOrDefault<double>() 
于 2018-04-27T09:31:11.430 回答