2010-05-06 16 views
6

मैं विशिष्ट मानदंडों से मेल खाने वाले आदेशों के बिना ग्राहकों की एक सूची वापस करने के लिए एनएचबेर्नेट में एक क्वेरी बनाने की कोशिश कर रहा हूं।निबर्ननेट और मौजूद नहीं है

<set name="Orders"> 
    <key column="CustomerID" /> 
    <one-to-many class="Order" /> 
</set> 

मैं एक प्रश्न NHibernate के ICriteria एपीआई का उपयोग कर सभी ग्राहकों को जो कोई आदेश नहीं है की एक सूची प्राप्त करने के लिए कैसे contruct है:

मेरे ग्राहक वस्तु आदेश का एक सेट होता? देशी एसक्यूएल का उपयोग करना, मैं इस तरह क्वेरी का प्रतिनिधित्व करने में सक्षम हूँ:

select * from tblCustomers c where not exists 
    (select 1 from tblOrders o where c.ID = o.CustomerID) 

मैं इस उपनाम और DetatchedCriteria वस्तुओं का उपयोग कर कैसे करना है यह पता लगाने में असमर्थ रहे हैं। किसी भी मार्गदर्शन की सराहना की जाएगी!

धन्यवाद!

उत्तर

7

यह है कि एसक्यूएल के लिए अनुवाद होगा ...

session.CreateCriteria<Customer>("c") 
    .Add(Subqueries.NotExists(
     DetachedCriteria.For<Order>("o") 
     .SetProjection(Projections.Constant(1)) 
     .Add(Restrictions.PropertyEq("c.ID", "o.Customer.ID")) 
     //Add more order restricitions here 
    )) 
    .List<Customer>(); 

अगर आप केवल कोई आदेश के साथ ग्राहकों को चाहते हैं तो आप भी Restrictions.IsEmpty() का उपयोग के रूप में ऊपर सटीक एक ही बात करने के लिए कर सकता है।

session.CreateCriteria<Customer>() 
    .Add(Restrictions.IsEmpty("Orders")) 
    .List<Customer>() 
+0

धन्यवाद, मुझे लगता है कि यह मुझे शुरू कर देगा। क्या NHibernate o.CustomerID का उपयोग करने के बारे में शिकायत करेगा ... वह कॉलम डीबी में है लेकिन मेरे ऑर्डर क्लास में कॉलम के रूप में मैप नहीं किया गया है। (NHibernate ने स्वचालित रूप से ग्राहक के सेट में कुंजी कॉलम के रूप में निर्दिष्ट के रूप में इसे जोड़ा।) – Dan

+0

ओह..यह सही है, इसे 'o.Customer.ID' – dotjoe

+0

होना चाहिए, दोनों entitties को सबकुछ काम करने के लिए एक-दूसरे से मैप किया जाना चाहिए ? Cuz वर्तमान में मैं कथन दर्ज नहीं कर सकता, यहां तक ​​कि इंटेलिजेंस इसे हाइलाइट नहीं करता है। –

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