2009-11-18 11 views

उत्तर

3

मैं बाहर काम कैसे IsNotEmpty एक्सप्रेशन का उपयोग करके यह करने के लिए। यहाँ यह उपयोग कर रहा है NHibernate लैम्ब्डा एक्सटेंशन:

Session.CreateCriteria<FooBar>() 
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes)) 
    .List<FooBar>(); 
+0

दरअसल ... और आपने मुझे यह विचार दिया कि इसे सरल तरीके से और निबर्ननेट लैम्ब्डा एक्सटेंशन के बिना किया जा सकता है। मैंने उस विकल्प को शामिल करने के लिए अपना जवाब संपादित किया है। – tolism7

28

यहाँ कैसे आप यह कर सकते है:

var fooBars = Session.CreateCriteria<FooBar>() 
     .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>(); 

... यह सोचते हैं एक संग्रह संपत्ति है (एक से कई) FooBar ऑब्जेक्ट में "Bazs"।

वैकल्पिक रूप से आप उस तरह अलग मापदंड इस्तेमाल कर सकते हैं:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id")); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 
+0

बहुत अच्छा! धन्यवाद! – ldp615

+0

इससे मुझे निहितार्थ त्रुटि को हल करने में मदद मिली: "मिलान करने वाले मानदंड जानकारी प्रदाता को नहीं मिला", सरल उदाहरण के लिए धन्यवाद। – Timbob

5

करने के बाद सिर्फ एक संबंधित समस्या हल हो और अंत में एक समाधान मैंने सोचा कि मैं इस सवाल का जवाब यहाँ साझा करते हैं पर पहुंचे: मान लिया जाये कि आप मूल सवाल क्वेरी चाहते

, साथ उप-प्रश्न पर एक अतिरिक्त शर्त:

SELECT * FROM FooBar fb 
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id 
       AND Quantity = 5) 

मान लिया जाये कि आप माता-पिता के लिए बाज वर्ग पर एक संदर्भ है, कहा जाता है, का कहना है कि FooBarRef [Fluent मानचित्र कक्षा में आप संदर्भ() विधि का उपयोग करें], आप निम्नानुसार क्वेरी बनायेगा:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz") 
     .SetProjection(Projections.Property("baz.FooBarId")) 
     .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id")) 
     .Add(Expression.Eq("baz.Quantity", 5)); 

var fooBars = Session.CreateCriteria<FooBar>("fooBar") 
     .Add(Subqueries.Exists(dCriteria)).List<FooBar>(); 

मैं 100% उर्फ ​​"यह" है, जो उर्फ ​​NHibernate स्वचालित रूप से क्वेरी में जड़ इकाई (टेबल) को आवंटित है की कड़ी कोडिंग के बारे में आश्वस्त नहीं हूँ, लेकिन यह एक ही रास्ता मैं नहीं हुआ है उप-क्वेरी के भीतर से मूल क्वेरी की तालिका की कुंजी को संदर्भित करने के लिए मिला।