2010-09-15 7 views
5

यह फ़ंक्शन किसी उपयोगकर्ता खोज इनपुट के लिए संपर्क सूची वापस करने के लिए उपयोग किया जाता है। खोज शब्द की संख्या हमेशा कम से कम एक होती है, लेकिन कई हो सकती हैं।लिंक 2 एसक्यूएल क्वेरी में क्लॉज की अनिश्चित संख्या को गतिशील रूप से जोड़ने का सही तरीका क्या है?

public IList<Contact> GetContacts(string[] searchTerms) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         orderby _contacts.LastName ascending, _contacts.FirstName ascending 
         select _contacts; 

     foreach (string term in searchTerms) 
     { 
      contacts = (IOrderedQueryable<Contact>)contacts.Where(x => SqlMethods.Like(x.FirstName, "%" + term + "%") 
                    || SqlMethods.Like(x.MiddleName, "%" + term + "%") 
                    || SqlMethods.Like(x.LastName, "%" + term + "%") 
                    || SqlMethods.Like(x.PreferredName, "%" + term + "%")); 
     } 

     return contacts.ToList<Contact>(); 
    } 
} 

समस्या लूप में है। केवल अंतिम खोज शब्द का उपयोग कभी भी किया जाता है, भले ही जेनरेटेड एसक्यूएल सही दिखता है (जैसा कि शब्दों की संख्या के लिए खंडों की सही मात्रा में उत्पन्न होता है)।

उदाहरण - यदि मैं दो शब्द ('एंड्र', 'एसएम') पास करता हूं, तो एसक्यूएल उत्पन्न खंडों के दो ब्लॉक दिखाता है, लेकिन दोनों ब्लॉक में केवल 'sm' को param के रूप में उपयोग करता है।

मैं क्या गलत कर रहा हूं? क्या मुझे एसक्यूएलएमआईड्स का भी उपयोग करना चाहिए?

+1

आप कहते हैं कि उत्पन्न एसक्यूएल सही दिखता है, क्या आप इसे पोस्ट कर सकते हैं? क्या आपने जेनरेट किए गए SQL को मैन्युअल रूप से चलाने का प्रयास किया है? –

+0

हाँ यदि मैं मैन्युअल रूप से चलाता हूं तो यह काम करता है, यह सरणी में अंतिम 'टर्म' का उपयोग सभी पैराम्स के लिए सर्वो के रूप में कर रहा है। अजीब। – IckleMonkey

उत्तर

5

शायद समस्या लूप चर अवधि को कैप्चर करने के साथ है। इसे आज़माएं:

foreach (string term in searchTerms) 
{ 
    string t = term; 
    contacts = ... // use t instead of term 
} 
+0

आप मेरे दोस्त एक प्रतिभाशाली हैं। काम करता है !!! – IckleMonkey

+0

क्या आप जानते हैं कि ऐसा क्यों होगा? – IckleMonkey

+0

क्योंकि आप लूप वैरिएबल पर बंद कर रहे हैं, इसलिए जब आप क्वेरी शब्द चलाने के लिए आते हैं तो हमेशा पारित सरणी में अंतिम मान होता है। यह प्रश्न देखें: http://stackoverflow.com/questions/227820/why-is-it-bad-to-use-a-iteration-variable-in-a-lambda-expression –

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

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