2011-07-15 14 views
5
का उपयोग कर

मैं NHibernate में निम्नलिखित एसक्यूएल परिवर्तित करने के लिए कोशिश कर रहा हूँ:पर एक श्रृंखलाबद्ध पूरा नाम फजी खोजें NHibernate

SELECT * FROM dbo.Customer 
WHERE FirstName + ' ' + LastName LIKE '%' + 'bob smith' + '%' 

मैं इस तरह कुछ करने के लिए कोशिश कर रहा था, लेकिन यह काम नहीं कर रहा:

name = "%" + name + "%"; 

var customers = _session.QueryOver<Customer>() 
      .Where(NHibernate.Criterion.Restrictions.On<Customer>(c => c.FirstName + ' ' + c.LastName).IsLike(name)) 
      .List(); 

जो मैं मूल रूप से करने की कोशिश कर रहा हूं वह "बॉब स्मिथ" के उदाहरण मान के साथ टेक्स्ट बॉक्स में किसी ग्राहक के नाम की खोज करने में सक्षम है और इसके लिए उपरोक्त SQL में LIKE अभिव्यक्ति का उपयोग करके डेटाबेस को खोजने के लिए है।

यदि मैं फर्स्टनाम और लास्टनाम कॉलम को गलत तरीके से खोजने जा रहा हूं, तो कृपया मुझे एक विकल्प के साथ मदद करें, लेकिन उपर्युक्त SQL क्वेरी मुझे जो चाहिए उसे प्राप्त करती है। 2 समाधान के साथ

अद्यतन:

इसलिए मैं अब इस समस्या का दो समाधान मिल गया है। एक मानदंड एपीआई का उपयोग करना है। निम्नलिखित पोस्ट में एक उत्तर है जो महान काम करता है: https://stackoverflow.com/a/2937100/670028

अन्य समाधान जो मैंने पाया है, मेरे सहायक सहकर्मियों में से एक को धन्यवाद जो LINQ प्रक्षेपण और अज्ञात प्रकारों का उपयोग करने का सुझाव देते हैं।

var customers = session.Query<Customer>() 
    .Select(x => new { FullName = x.FirstName + " " + x.LastName, Customer = x }) 
    .Where(x => x.FullName.Contains("Bob Smith")) 
    .Select(x => x.Customer) 
    .ToList(); 
+0

आपको एक संक्षिप्त एसक्यूफंक्शन का उपयोग करके प्रोजेक्शन पर 'प्रतिबंध' जैसे 'उपयोग करना होगा। मुझे नहीं लगता कि एनएच आपके लिए स्ट्रिंग कॉन्सट प्रोजेक्शन बनाने के लिए पर्याप्त स्मार्ट है। – dotjoe

+0

अद्यतन: मैंने इस मामले में एनएचबीर्नेट कोड को बहुत गन्दा पाया और बस संग्रहीत प्रक्रिया के साथ चला गया। मैं वास्तव में जितनी ज्यादा हो सके संग्रहित प्रक्रियाओं से बचने की कोशिश करता हूं लेकिन कभी-कभी स्वयं को एसक्यूएल को क्रैंक करना आसान होता है। –

उत्तर

10

NHibernate एक एसक्यूएल बयान में अभिव्यक्ति का अनुवाद करने के लिए है, क्योंकि ऐसा नहीं करता सक्षम नहीं है

query.Where(Restrictions.On<MyType>(x => x.Field).IsLike(StringToSearch)) 

:

+0

मैंने इस पोस्ट का पुनरीक्षण किया और इस कोड को आजमाया और हालांकि यह सही ढंग से काम नहीं करता है, लेकिन मुझे अन्य समाधान देखने के लिए सही रास्ते पर मिला। किसी अन्य स्टैक ओवरफ्लो उत्तर से निम्नलिखित समाधान पूरी तरह से काम करता है, मैंने सोचा कि मैं साझा करूंगा: http://stackoverflow.com/a/2937100/670028 –

+0

हाय रैंडी, अगर आपको यह काम मिल गया है तो आप उत्तर को सही करने के लिए पोस्ट को संपादित कर सकते हैं और फिर इसे दुनिया के साथ साझा करने के लिए सही उत्तर के रूप में चिह्नित करें। – Peter

0

मुझे लगता है कि होगा यह होगा कुछ इस तरह:

.On (ग => c.IsLike (c.FirstName + '' + c.LastName))

यहाँ एक समाधान LINQ का उपयोग कर रहा है

क्योंकि आप सही मूल्यों की तुलना नहीं कर रहे हैं जिस तरह से आपके पास अभी है। यदि यह QueryOver या मानदंड एपीआई के साथ भी Complexe है आप HQL सिंटैक्स का उपयोग कर सकते हैं

0

मैं यह कोशिश कर सकते हैं पता करें सी => सी। फर्स्टनाम + '' + सी। लास्टनाम के साथ क्या करना है। एक समाधान कुछ इस तरह करने के लिए इस पुनर्लेखन जा सकता है:

Session.CreateCriteria<Customer>() 
    .Add(Restrictions.Like(
    Projections.SqlFunction("concat", 
          NHibernateUtil.String, 
          Projections.Property("FirstName"), 
          Projections.Constant(" "), 
          Projections.Property("LastName")), 
    "Bob Whiley", 
    MatchMode.Anywhere)) 
1

आप के रूप में संभव के रूप में दृढ़ता से टाइप अपने कोड रखने के लिए चाहते हैं, तो यहाँ मैं इसे कैसे हासिल की है। मुझे इसे एक संयोजन में उपयोग करने की आवश्यकता थी। उम्मीद है कि यह किसी की मदद करता है!

var disjunction = new Disjunction(); 
var fullNameProjection = Projections.SqlFunction(
    "concat", 
    NHibernateUtil.String, 
    Projections.Property<UserProfile>(x => x.FirstName), 
    Projections.Constant(" "), 
    Projections.Property<UserProfile>(x => x.LastName) 
    ); 
var fullNameRestriction = Restrictions.Like(fullNameProjection, searchText, MatchMode.Anywhere); 
disjunction.Add(fullNameRestriction); 
संबंधित मुद्दे