2011-06-16 176 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