2010-07-21 15 views
9

मैं निम्नलिखित मैप की कक्षाएंNHibernate या मानदंड क्वेरी

Trade { ID, AccountFrom, AccountTo } 
Account {ID, Company} 
Company {ID} 

अब मैं एक तरह से समझ नहीं सभी ट्रेडों जहां

AccountFrom.Company.ID = X OR AccountTo.Company.ID = X 

मैं प्राप्त कर सकते हैं और निम्नलिखित का उपयोग कर काम करने के लिए का चयन करें:

criteria.CreateCriteria("AccountFrom").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 
criteria.CreateCriteria("AccountTo").CreateCriteria("Company").Add(Restrictions.Eq("ID", X); 

लेकिन मैं इसे एक या बल्कि एक में कैसे बदल सकता हूं। मैंने पहले विघटन का उपयोग किया है, लेकिन मुझे नहीं लगता कि अलग-अलग मानदंडों को कैसे जोड़ना है, केवल प्रतिबंध।

+1

इसे पढ़ने करना चाहिए AccountFrom.Company.ID = एक्स या AccountTo.Company.ID = एक्स ?? क्योंकि आपका प्रश्न समझ में नहीं आता है क्योंकि यह – Rippo

+0

ऑप्स है, हाँ आपका सही –

उत्तर

23

कोशिश करें:

return session.CreateCriteria<Trade>() 
    .CreateAlias("AccountFrom", "af") 
    .CreateAlias("AccountTo", "at") 
    .Add(Restrictions.Or(
     Restrictions.Eq("af.Company.CompanyId", companyId), 
     Restrictions.Eq("at.Company.CompanyId", companyId))) 
    .List<Trade>(); 

मुझे नहीं लगता कि आपको कंपनी को उपनाम करने की आवश्यकता होगी।

+0

आह धन्यवाद, आप पहली बार अन्य नाम बना है! नहीं था ' टी पता है। धन्यवाद –

5

मुझे लगता है कि आपके एनएचबीर्नेट विकल्प एनएचबीरनेट के किस संस्करण पर निर्भर हैं जिसका आप उपयोग कर रहे हैं।

अलगाव = या, संयोजन = और इस सवाल का here


जेमी इदे सिर्फ अधिक अच्छी तरह से जवाब ... यह का सार इस प्रकार है के रूप में

.Add(
    Expression.Disjunction() 
    .Add(companyId1) 
    .Add(companyId2) 
) 

ही:

.Add(Restrictions.Or(
    Restrictions.Eq("object1.property1", criteriaValue), 
    Restrictions.Eq("object2.property3", criteriaValue)) 
+0

लेकिन मैं नेस्टेड ऑब्जेक्ट्स कैसे जोड़ूं? मुझे एक ही संपत्ति पर प्रतिबंधों की आवश्यकता नहीं है, मुझे 2 अलग-अलग गुणों (2 अलग-अलग उप वर्गों पर) की आवश्यकता है –

+0

मुझे खेद है कि मैंने विवरण नहीं दिया ... 'जेमी आइडिया' ने अभी किया था। यह वही होना चाहिए जो आप चाहते हैं, और मुझे क्या कहना चाहिए था। .Add (Restrictions.Or ( Restrictions.Eq ("object1.property1", criteriaValue), Restrictions.Eq ("object2.property3", criteriaValue)) –

3

NHibernate करने के लिए LINQ का उपयोग:

var X = 0; // or whatever the identifier type. 
var result = Session.Linq<Trade>() 
       .Where(trade => trade.AccountFrom.Company.ID == X || 
           trade.AccountTo.Company.ID == X) 
       .ToList(); 

HQL का उपयोग करना:

var X = 0; // or whatever the identifier type. 
var hql = "from Trade trade where trade.AccountFrom.Company.ID = :companyId or trade.AccountTo.Company.ID = :companyID"; 
var result = Session.CreateQuery(hql) 
       .SetParameter("companyId", X) 
       .List<Trade>(); 
संबंधित मुद्दे