2010-01-20 14 views
73

क्या लिंक में कोई विधि है जहां आप SQL स्ट्रिंग्स बनाने के लिए उपयोग कर सकते हैं जैसे ... ... जहां (ए = 1) या (ए = 2) "?"या" लिंकक में समकक्ष() lambda अभिव्यक्ति

+3

मुझे लगता है कि आप जानते हैं कि '||' का उपयोग कैसे करें और कुछ गतिशील चाहते हैं, जैसे 'a = a.where (घंटा => घंटा <20); अगर (सप्ताहांत) एक = a.where (घंटा => घंटा> 6); '। आप यह स्पष्ट करना चाहते हैं कि अधिक स्पष्ट रूप से ... – Kobi

उत्तर

154

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

var query = collection.Where(c => c.A == 1 || c.B == 2); 

या अपने .Where() कॉल में एक PredicateBuilder

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == 1); 
if (allowB) 
{ 
    predicate = predicate.Or(f => f.B == 1); 
} 

var query = collection.Where(predicate); 
+0

भविष्यवाणियों का अच्छा उपयोग! +1 :) –

+0

यह बहुत अच्छा काम करता था क्योंकि मुझे आने वाले पैरामीटर के मूल्यों के आधार पर मेरा निर्माण करने की आवश्यकता थी - बहुत बढ़िया! – dadwithkids

+0

बहुत अच्छा। यह एक शर्म की बात है कि यह मानक के रूप में .NET के अंदर एक समारोह के रूप में शामिल नहीं है। – maxp

20

आप अपने एकल में मानक नेट बूलियन ऑपरेटरों का उपयोग कर सकते हैं जहां खंड:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b') 
+4

मुझे लगता है कि यह सबसे अच्छा और सरल जवाब है। – user1477388

+1

यह सबसे आसान जवाब है। – Eranda

16

आपके पास वे सभी का उपयोग ऑपरेटर सामान्य सी # ===> || के रूप में के लिए "या" & & के लिए "और" आदि

var something = from s in mycollection 
       where s.something == 32 || 
         s.somethingelse == 45 
       select s 
+1

मैं इस विधि को पसंद करता हूं, यह अधिक प्राकृतिक लग रहा है – nXqd

1

का उपयोग कर, मानक बूलियन 'या' ऑपरेटर का उपयोग ||

var query = items.Where(item => (item == 1 || item == 2)); 

सभी कहाँ कॉल करता है कुछ भी पर एक बूलियन तुलना आप चाहते है, तो आप इसे के रूप में ज्यादा सशर्त तर्क के साथ भर सकते हैं के रूप में आप चाहते हैं।

0

यह अब .NET में बनाया गया है, यह सुनिश्चित नहीं है कि यह पहले नहीं था। मौजूदा लिंक क्वेरी को देखते हुए आप एक क्लॉज जोड़ सकते हैं जो स्ट्रिंग्स (सर्चस्ट्रिंग्स) की सरणी लेता है, और जांचें कि उनमें से कोई भी आपके द्वारा खोजे गए संग्रह में जो भी ऑब्जेक्ट मेल खाता है या नहीं। ToLower() का उपयोग करके यह सुनिश्चित करता है कि आप SQL क्वेरीज़ में केस संवेदनशीलता से बचें।

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower())); 

आप संग्रह के वस्तु को सरणी में सभी शब्दों का मिलान करके एक 'और' विधेय के लिए एक ही बात कर सकते हैं।

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower())); 

इस उदाहरण में मैं एक संग्रह में प्रत्येक वस्तु को संबद्ध करता है, और एस SearchStrings सरणी में प्रत्येक स्ट्रिंग से सम्बंधित है।

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