联合查询内的NHibernate查询和

联合查询内的NHibernate查询和,nhibernate,join,aggregate,queryover,Nhibernate,Join,Aggregate,Queryover,虽然我读过NHibernate食谱和所有可用的论坛帖子,但我仍然无法完成这个简单的查询: 我有每个人都有一个帐户的用户。每个账户都有余额。 这些类看起来像: public class User { public virtual int Id { get; set; } public virtual Account Account { get; set; } public virtual bool Active { get; set; } } public class A

虽然我读过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'
我不知道如何用NHibernate3的新QueryOverAPI解决这个问题。你能提供一个代码示例吗

提前谢谢你

丹尼尔·朗


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

var result = Session.Query<User>()
                        .Where(x => x.Active)
                        .Sum(x => x.Account.Balance)
var result=Session.Query()
.其中(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>()
User userAlias=null;
accountAlias=null;
session.QueryOver(()=>userAlias)
.JoinAlias(()=>userAlias.Account,()=>accountAlias)
.Where(()=>userAlias.Active)
.Select(projects.Sum(acct=>accountAlias.Balance))
.SingleOrDefault()

您尝试过类似的方法吗

session.QueryOver<User>(() => userAlias)
    .JoinAlias(() => userAlias.Account, () => accountAlias)
    .Where(() => userAlias.Active)
    .Select(Projections.Sum<Account>(acct => acct.Balance))
    .UnderlyingCriteria.UniqueResult()
session.QueryOver(()=>userAlias)
.JoinAlias(()=>userAlias.Account,()=>accountAlias)
.Where(()=>userAlias.Active)
.Select(projects.Sum(账户=>账户余额))
.UnderlineCriteria.UniqueResult()

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

您在回答中写道:

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>()
User userAlias=null;
accountAlias=null;
session.QueryOver(()=>userAlias)
.JoinAlias(()=>userAlias.Account,()=>accountAlias)
.Where(()=>userAlias.Active)
.Select(projects.Sum(acct=>accountAlias.Balance))
.SingleOrDefault()
泛型类型不需要别名。它可以是:

Account accountAlias = null;

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

非常感谢!您刚才在那里输入了错误-使用“accountAlias.Balance”而不是“acct.Balance”。见我的编辑上面。任何地方的别名都起了作用!啊,那就是我想要的。希望我能记得。意外的acct.Balance不起作用,但可能别名胜过传递到投影中的任何内容。