2011-06-16 42 views
6

ben yukarı ve aşağı NHibernate Cookbook ve mevcut tüm forum-mesaj yoluyla okuma olmasına rağmen içinde, hala bitmiş bu basit sorgu almanız mümkün değilim:NHibernate QueryOver Sum JoinQueryOver

Ben herkes birine sahip olan kullanıcılar hesabı. Her hesap bir dengede. sınıflar böyle bakmak:

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; } 
} 

Şimdi tüm aktif kullanıcıların dengesini özetlemek istiyorum. Düz SQL fazla bir şey ... oldukça kolaydır:

SELECT SUM(a.Balance) 
FROM User u 
INNER JOIN Account a 
ON u.Account_id = a.Id 
WHERE u.Active = 'true' 

herhangi ben fikrim yok, NHibernate 3. yeni QueryOver-Api o nasıl çözebileceklerini bir verebilir misiniz kod örneği?

Teşekkürler!

Daniel Lang


DÜZENLEME
NHibernate Linq ile çok çok kolay olduğunu, biliyorum ama ... İşte çalışan Linq Örnek ise o QueryOver kullanarak çözmek istiyoruz: bulabildiğim AlexCuse için

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


ÇÖZÜM
Teşekkür son çözüm (çok yakındı) - işte tam kod:

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

cevap

9

Böyle bir şey denediniz mi? Ben UniqueResult eşdeğer QueryOver API ne olduğundan emin değilim

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

, böylece altta yatan kriterleri üzerinden gitmek zorunda kaldı.

+1

Çok teşekkür ederim! Orada sadece yazım hatası vardı - "acct.Balance" yerine "accountAlias.Balance" kullanın. Yukarıdaki düzenlemeye bakın. Her yerde takma adlar hile yaptı! –

+0

Ah, bu SingleOrDefault benim aradığım şey. Umarım hatırlayabilirim. Sürpriz acct.Balance işe yaramazdı ama belki de takma adı, projeksiyona aktarılan her şeyi koyar. – AlexCuse

İlgili konular