联合查询内的NHibernate查询和
虽然我读过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
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不起作用,但可能别名胜过传递到投影中的任何内容。