2009-08-26 11 views
12

के बजाय परिणाम और प्रश्न कुछ स्पष्ट हो सकते हैं लेकिन मैं कुछ घंटे के लिए इसके खिलाफ अपने सिर को टक्कर लगी हूं और यह पता नहीं लगा सकता कि मैं कहां गलत हूं।एनएचबेर्नेट विभाजन के परिणामस्वरूप या

मैं एनएचबीरनेट क्वेरी में जोड़ने या मानदंडों का परीक्षण करने के लिए कोड का एक छोटा टुकड़ा चलाने की कोशिश कर रहा हूं।

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     criteria.Add(Restrictions.Disjunction().Add(criterion)); 
    } 

    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 

यह सिर्फ कुछ सरल है कि मैं आईडी 1-3 के साथ सभी परीक्षण की वस्तुओं वापस जाने के लिए उम्मीद करेंगे: यह कोड मैं है। लेकिन, जब मैं कोड चला रहा हूं, तो जेनरेट की गई क्वेरी आईडी = 1 और आईडी = 2 और आईडी = 3 के साथ ऑब्जेक्ट ढूंढना है। जो, आश्चर्यजनक रूप से, कुछ भी वापस नहीं करता है।

मैपिंग सही तरीके से स्थापित है (मैं सभी ऑब्जेक्ट्स को जोड़/संपादित/हटा/सूचीबद्ध कर सकता हूं) और इन आईडी के साथ वहां ऑब्जेक्ट्स हैं।

क्या मैं कुछ गलत कर रहा हूं? मैंने जो ऑनलाइन देखा है, उसका उपयोग करने के किसी भी नमूने इस तरह इसका उपयोग करते हैं। मुझे नहीं लगता कि यह क्यों उपयोग करता रहता है और।

धन्यवाद।

उत्तर

16

आपकी समस्या इस तथ्य में निहित है कि आप नया हर समय (लूप में) संयोजन बना रहे हैं। आपको क्या करने की जरूरत है:

int[] ids = {1, 2, 3}; 
ICriterion disjunction = Restrictions.Disjunction(); 
foreach (int id in ids) 
{ 
    ICriterion criterion = Restrictions.Eq("Id", id) 
    disjunction.Add(criterion); 
} 
criteria.Add(disjunction); 

वाक्य रचना एक सा गलत हो सकता है - मैं एक हाइबरनेट पुरुष के बजाय नेट :-)

स्पष्ट करने के लिए कर रहा हूँ, अपने मूल कोड की तरह कुछ उत्पन्न होगा (छद्म कोड में):

WHERE (OR(ID=1)) AND (OR(ID=2)) AND (OR(ID=3)) 

"या", disjunctions चुपचाप छोड़ दिया गया करने के लिए करने के लिए के बाद से वहाँ कुछ भी नहीं है।

+1

जादू, कि एक का इलाज काम किया। जब मैं आपके कोड को देखता हूं तो समझ में आता है - मैंने कभी सोचा नहीं कि यह व्यक्तिगत ओआरएस के साथ "और" होगा। आपके कोड में एकमात्र मामूली परिवर्तन इस प्रकार का संयोजन बना रहा है: जंक्शन विघटन = प्रतिबंध। संयोजन(); (आईक्रिटिशन में 'एड' नहीं है)। धन्यवाद! –

5

अपडेट किया गया ChssPly76 के उत्तर के आधार पर कोड:

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    ICriteria criteria = session.CreateCriteria<TestObject>(); 
    Junction disjunction = Restrictions.Disjunction(); 

    int[] ids = {1, 2, 3}; 
    foreach (int id in ids) 
    { 
     ICriterion criterion = Restrictions.Eq("Id", id); 
     disjunction.Add(criterion); 
    } 
    criteria.Add(disjunction); 


    IList<TestObject> items = criteria.List<TestObject>(); 
    return items; 
} 
संबंधित मुद्दे