2011-06-16 148 views
6

虽然我是通过NHibernate的食谱和所有可用的论坛,帖子读取上下,我还是没能得到这样做了简单的查询:NHibernate的QueryOver总和内JoinQueryOver

我有用户具有一个大家帐户。每个帐户都有一个余额。 的类看起来像:

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.请您提供代码例子吗?

预先感谢您!

丹尼尔·兰


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

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


SOLUTION
感谢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>() 

回答

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

非常感谢!你只是在那里打字 - 使用“accountAlias.Balance”而不是“acct.Balance”。看到我上面的编辑。任何别名都有诀窍! – 2011-06-17 17:59:45

+0

啊,SingleOrDefault就是我一直在寻找的东西。希望我能记住它。惊讶的acct.Balance不会工作,但也许别名会超过传递给投影的任何东西。 – AlexCuse 2011-06-17 19:54:46