2009-11-06 5 views
22

मैं NHBernate.Linq का उपयोग करके इस क्वेरी का उत्पादन कैसे कर सकता हूं?NHibernate.Linq LIKE

WHERE this_.Name LIKE @p0; @p0 = 'test' // Notice NO % wild card 

नोट, यह लिंक से एसक्यूएल या इकाई फ्रेमवर्क नहीं है। यह NHibernate है।

संपादित करें: का उपयोग कर ICriteria

यहाँ वांछित क्वेरी है:

criteria.Add(Expression.Like("Name", "test")); 
return criteria.List<Theater>(); 

उत्तर

6

एनएच 4 (और शायद थोड़ा पहले) के साथ, एक अंतर्निहित Like स्ट्रिंग एक्सटेंशन NHibernate.Linq नामस्थान के भीतर उपलब्ध है: Like(this string matchExpression, string sqlLikePattern)। (यह NHibernate.Linq.SqlMethods विस्तार वर्ग पर परिभाषित किया गया है।)

using NHibernate.Linq; 
... 
session.Query<Theater>() 
    .Where(t => t.Name.Like("test")); 
17

मेरा मानना ​​है कि यह आपके लिए क्या देख रहे है:

var theaters = from theater in Session.Linq<Theater>() 
       where theater.Name.Contains("test") 
       select theater; 

मेरी परीक्षण उत्पन्न के अनुसार एक एसक्यूएल 'LIKE' कथन: "... जहां थियेटर। नाम% परीक्षण%"

जो आपके द्वारा प्रदान किए गए मानदंड स्निपेट का बिल्कुल सटीक है।

+1

(प्रश्न में प्रदान की गई) मानदंड का उपयोग करना, मैं नहीं दिखाई दे रहा% वाइल्डकार्ड उत्पन्न किया जा रहा। – mxmissile

+0

मैंने अभी यूनिट टेस्ट चलाया है जो मेरे पास दिए गए कोड के साथ है और उसने सर्क स्ट्रिंग पर दोनों सिरों में% वाइल्डकार्ड के साथ एक SQL कथन बनाया है। मैं मानदंड equilevant का उपयोग कर एक ही परीक्षण चलाता हूं और यदि मैं मानदंडों का उपयोग करता हूं तो मुझे सटीक उसी SQL कथन मिलता है। जोड़ें (अभिव्यक्ति। जैसे ("नाम", "परीक्षण", MatchMode.Anywhere)); मैं SQL सर्वर 2005 के साथ NHibernate 2.1 का उपयोग करता हूं। यदि आप एक ही कॉन्फ़िगरेशन का उपयोग कर रहे हैं तो आपको एक ही परिणाम देखने में सक्षम होना चाहिए। – tolism7

+0

मुद्दा यह है कि मैं लिंकक का उपयोग कर वाइल्डकार्ड नहीं चाहता हूं। इस पर मेरी टिप्पणी आपके उत्तर का जवाब दे रही थी "आपके द्वारा प्रदत्त मानदंड स्निपेट का आउटपुट"। क्षमा करें अगर मैं स्पष्ट नहीं था। मैं प्रश्न में बताए गए अनुसार आईसीआरटीरिया के साथ वांछित क्वेरी प्राप्त कर सकता हूं, लेकिन लिंकक का उपयोग करके इसे प्राप्त नहीं कर सकता। – mxmissile

15

मैं अपने प्रोजेक्ट में एक ही समस्या थी और एक समाधान मिला:

SELECT ... WHERE Name LIKE '%test' AND Name LIKE 'test%' 
+4

अतिरिक्त: '&& x.Name.Length ==" परीक्षण "। तरंगदैर्ध्य। अन्यथा आप 'test blah blah blah test' –

+6

जैसे परिणामों के साथ समाप्त हो जाएंगे, मुझे बिंदु याद आ रही है, लेकिन निश्चित रूप से आप वास्तव में' पसंद 'नहीं कर रहे हैं लेकिन' बराबर '...। जहां (x => x.Name.Equals ("test"); –

+0

यह वास्तव में @ n3rd ने कहा है। –

22

इस जबकि करने के लिए

session.Linq<Theater>() 
    .Where(x => x.Name.StartsWith("test") && x.Name.EndsWith("test"); 

यह एसक्यूएल में तब्दील चिह्नित किया गया है का समाधान के रूप में है, जो समय पर सही था , क्या मैं यह भी ध्यान रख सकता हूं कि NHibernate में अब कुछ एक्सटेंशन हैं ताकि आप निम्न कार्य कर सकें:

Session.QueryOver<MyEntity>() 
    .Where(x => x.Property.IsLike("something", MatchMode.Anywhere)) 
    .List(); 

थी एस आपके लिए LIKE '%something%' करेगा।

+1

ये आउट-द-बॉक्स हैं, वैसे, कस्टम निर्मित नहीं हैं। – Kezzer

+0

+1 जो मैं देख रहा था के लिए, ऊपर की सटीक समस्या को हल करने के लिए ध्यान देने योग्य हो सकता है, आप MatchMode का उपयोग करना चाहते हैं। एक्स्टैक्ट (कोई% वाइल्डकार्ड) – PJUK

+0

रिशेर्पर का उपयोग न करने पर 'NHibernate.Criterion का उपयोग करना 'था; लेकिन बहुत अच्छा काम करता है! धन्यवाद। –