2011-06-16 26 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; } 
} 

अब मैं सभी सक्रिय उपयोगकर्ताओं के संतुलन योग करने के लिए करना चाहते हैं। और कुछ नहीं ... सादा एसक्यूएल में यह काफी आसान है:

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

मैं किसी भी मैं विचार की जरूरत नहीं है, मैं कैसे NHibernate 3. से नए QueryOver-एपीआई के साथ कि हल कर सकते थे यदि आप एक प्रदान करते हैं कृपया सकते हैं कोड-उदाहरण?

अग्रिम धन्यवाद!

डैनियल लैंग


संपादित
मुझे पता है, कि NHibernate LINQ के साथ यह भी बहुत आसान है, लेकिन मैं इसे QueryOver का उपयोग कर हल करने के लिए चाहते हैं ... यहाँ काम कर Linq-उदाहरण है: मैं मिल सकता है AlexCuse को

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


समाधान
धन्यवाद अंतिम समाधान (वह बहुत करीब था) - यहां पूरा कोड है:

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

मुझे यकीन है कि क्या UniqueResult बराबर QueryOver एपीआई में है नहीं कर रहा हूँ, इसलिए अंतर्निहित मापदंड के माध्यम से जाना पड़ा।

+1

बहुत बहुत धन्यवाद! आपके पास बस टाइपो था - "acct.Balance" के बजाय "accountAlias.Balance" का उपयोग करें। ऊपर मेरा संपादन देखें। कहीं भी उपनाम चाल चल रहा था! –

+0

आह, कि सिंगलऑर्डफॉल्ट वह है जिसे मैं ढूंढ रहा था। उम्मीद है कि मैं इसे याद कर सकता हूँ। आश्चर्यचकित एक्ट। संतुलन काम नहीं करेगा, लेकिन शायद उपनाम प्रक्षेपण में जो कुछ भी पारित हो जाता है। – AlexCuse

संबंधित मुद्दे