“या फिर Linq में समतुल्य कहाँ () लंबोदर अभिव्यक्ति


91

क्या Linq में कोई तरीका है जहाँ आप SQL स्ट्रिंग्स बनाने के लिए "... जहाँ (a = 1) OR (a = 2)" का उपयोग कर सकते हैं?


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

जवाबों:


189

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

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

या एक 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 );

यह महान काम के रूप में मैं अपने निर्माण की जरूरत है या आने वाले मापदंडों के मूल्यों पर निर्भर करता है - बहुत बढ़िया!
मार्क

बहुत ही शांत। यह शर्म की बात है कि यह मानक के रूप में .NET के अंदर एक फ़ंक्शन के रूप में शामिल नहीं है।
अधिकतम

1
बहुत अच्छा कार्यान्वयन, हालांकि यह नोट नहीं किया गया है यह केवल C # 5+ के लिए काम करता है।
थॉमस। डैनलाइन

25

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

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

19

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

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

1

अपने .Where()कॉल में मानक बूलियन 'या' ऑपरेटर का उपयोग करें ||

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

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


0

यदि आप पैरामीटर गणना नहीं जानते हैं, तो आप इसका उपयोग कर सकते हैं:

नमूना डेटा

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

कोड

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

यह अभी .net में बनाया गया है, सुनिश्चित नहीं है कि यह पहले नहीं था। एक मौजूदा Linq क्वेरी को देखते हुए आप एक ऐसा क्लॉज जोड़ सकते हैं जो स्ट्रिंग्स (SearchStrings) की एक सरणी लेता है, और जाँच करें कि उनमें से कोई भी आपके द्वारा संग्रह में मौजूद किसी भी वस्तु से मेल खाता है या नहीं। 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 सरणी में प्रत्येक स्ट्रिंग से सहसंबंध रखता है।


1
ध्यान दें कि 'किसी भी' का ईएफ प्रदाता द्वारा अनुवाद नहीं किया जा सकता है और इसका मूल्यांकन स्थानीय रूप से एक पूर्ण तालिका स्कैन और इन-मेमोरी फ़िल्टरिंग के रूप में किया जाएगा।
वेड बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.