2009-06-17 12 views
5

मान लिया जाये कि हम निम्न तालिका है:सशर्त एकाधिक फील्ड्स, खोज और फ़िल्टर LINQ में

Person: 
    PersonID, 
    Name, 
    Age, 
    Gender 

और हम है कि उपयोगकर्ताओं को नाम और/या के अनुसार तालिका में खोज करने की अनुमति देता है एक खोज समारोह प्रदान कर रहे हैं उम्र।

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

यह करने के लिए तर्क के रूप में निम्नानुसार लिखा जा सकता है:

अब जबकि कोड बहुत लंबा और गंदा हो जाता है ... अगर कोई कैसे मैं के साथ एक एकल क्वेरी में ऊपर सेक कर सकते हैं एक के बाद -सेल?

उत्तर

4

एक वैकल्पिक जो मैं एसक्यूएल जो Linq में लागू किया जा सकता में इस्तेमाल किया है भी

var p = from p in Person 
     where p.Name == Name_TextBox || Name_TextBox == String.Empty 
     select p; 

(ध्यान दें कि आपके 'LINQ' SQL सिंटैक्स, जो संकलन नहीं होगा उपयोग कर रहा है। इसके अलावा, आप नहीं कर सकते हैं एक वर के रूप में आप सीधे एक मूल्य बताए कर रहे हैं) इस

 string personName = txtPersonName.Text; 
     int personAge = Convert.ToInt32(txtAge.Text); 
     var opportunites = from p in this.DataContext.Persons 
          select new 
          { 
           p.PersonID, 
           p.Name, 
           p.Age, 
           p.Gender 
          }; 

     if (personsID != 0) 
      opportunites = opportunites.Where(p => p.PersonID == personID); 

     if (personName != string.Empty) 
      opportunites = opportunites.Where(p => p.Name.StartsWith(personName)); 

     if (personAge != 0) 
      opportunites = opportunites.Where(p => p.Age == personAge); 

तरह

+0

पर वास्तव में अच्छी तरह से काम करता है मैं कोड – Graviton

9

कोशिश कोड यह ठीक काम करेंगे घोषणा करते हैं। यदि व्यक्तिनाम नहीं दिया गया है तो इसे कहां जोड़ा जाएगा, और यदि दिया जाता है तो यह जोड़ा जाएगा।

+0

अद्यतन किया है यह अब तक का बेहतर जवाब है। – Malcolm

+0

यह एक बेहतर उत्तर है कि मैंने यह निर्दिष्ट नहीं किया था कि मैं नहीं चाहता हूं- अन्यथा .. – Graviton

+1

मुझे यह स्वीकार करना होगा कि मुझे लगता है कि यह समाधान भी क्लीनर है, लेकिन मैं आखिरी बार चयन को सहेजता था - इस तरह आप बस इमारत कर रहे हैं कुछ भी निष्पादित किए बिना क्वेरी को ऊपर (मुझे विश्वास है?)। तो विभिन्न अवसरों = व्यक्तियों के साथ शुरू करें, फिर अंत में कहां चुनें और चुनें। और निष्पक्षता में, यह समाधान अगर-तो-दूसरे का उपयोग नहीं कर रहा है, लेकिन बस अगर। – Benjol

2

नल कोलेसिंग ऑपरेटर का उपयोग क्यों नहीं करें? जैसे।

var products = from a in context.products where a.ID == (productID ?? a.ID) select a;

यह मेरा प्रणाली

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