NHQuerynate QueryOver JoinQueryOver中的Sum

时间:2011-06-16 15:38:50

标签: nhibernate join aggregate queryover

虽然我正在阅读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解决这个问题。你能提供一个代码示例吗?

提前谢谢!

Daniel Lang


修改
我知道,使用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 个答案:

答案 0 :(得分:9)

你尝试过这样的事吗?

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

我不确定QueryOver API中的UniqueResult等价物是什么,因此必须通过基础标准。

答案 1 :(得分:0)

你在答案中写道:

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