2016-03-01 8 views
5

मेरा मानना ​​है कि इसे लिखने का एक बेहतर तरीका है लेकिन मुझे मानसिक ब्लॉक का सामना करना पड़ रहा है।या ऑपरेटर का उपयोग कर लैम्ब्डा अभिव्यक्ति

int num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && 
          (x.FavoriteColor == "Green" || 
           x.FavoriteColor == "Blue" || 
           x.FavoriteColor == "Red")).Count(); 
} 

return num; 

वहाँ एक बेहतर तरीका OR बयान लिखने के लिए है? मैंने कोशिश की है:

x.FavoriteColor == "Green" || "Blue" || "Red" 

लेकिन संकलक का कहना है Operator || cannot be applied to operands of type 'bool' and 'string'

किसी भी मदद की सराहना की है।

+1

जाओ स्वैप कर सकते हैं। मेरा मानना ​​है कि आपका वर्तमान उदाहरण पठनीय और रखरखाव दोनों है। इसमें कुछ भी गलत नहीं है। ध्यान दें कि 'उपयोग' और 'वापसी' कथन के बीच कुछ भी नहीं है, तो आप केवल 'वापसी डीबी कर सकते हैं। योग्य। ...' – Default

+0

त्वरित टिप्पणियों और उत्तरों के लिए सभी का धन्यवाद। मैंने उन सभी उत्तरों को इतनी तेज़ी से होने की उम्मीद नहीं की थी, लेकिन मुझे लगता है कि यही कारण है कि SO # 1 है। नोट के लिए @Default धन्यवाद। मैं इसका उपयोग करना सुनिश्चित करूँगा। धन्यवाद फिर से –

+0

@ सर्वी अच्छा बिंदु, मुझे याद आया। भ्रम से बचने के लिए टिप्पणी हटा दी –

उत्तर

6

आप सरणी/सूची/हैशसेट की Contains विधि का उपयोग कर सकते हैं।

var colors = new List<string> {"Green", "Red", "Blue" }; 

db.Table.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

यह SQL क्वेरी उत्पन्न होगा की तरह

SELECT ... WHERE FavoriteColor = 'Baseball' AND FavoriteColor in ("Green", "Red", "Blue") 

मैं जोड़ने के लिए है कि अगर आप डेटासेट जो एक स्मृति में जमा हो जाती है के साथ काम आप ध्यान रखें कि सूची के Contains हे लेता है में रखना चाहिए चाहते हैं (एन) परिणाम प्राप्त करने के लिए पुनरावृत्ति। इसलिए यदि colors में बहुत सारे तत्व हैं, तो आपको O (1) के बजाय सेट HashSet का उपयोग करना चाहिए।

var colors = new HashSet<string> {"Green", "Red", "Blue", .... }; 

someDataSet.Where(x => x.FavoriteSport == "Baseball" && 
         (colors.Contains (x.FavoriteColor)).Count() 

आप आप वस्तुओं की एक कंटेनर का उपयोग करें और विधि शामिल उपयोग कर सकते हैं सूची-HashSet प्रदर्शन की तुलना पा सकते हैं here

+0

हमेशा आईएमओ का सबसे अच्छा उदाहरण दिखाएं। आपको अपने उत्तर के अंत में संपादित करने की आवश्यकता नहीं है। – Default

+2

जिज्ञासा से बाहर, क्या हैशसेट में प्रदर्शन वृद्धि होगी? यह डेटाबेस के लिए एक क्वेरी है, जिसका अनुवाद गतिशील एसक्यूएल में किया जाता है, इसलिए इसे पूरे संग्रह के माध्यम से फिर से चालू करना चाहिए। –

+1

@ वेलेंटीन ठीक है, मैं स्मृति में सहमत हूं, हैशसेट के माध्यम से एक खोज अधिक कुशल है (कभी-कभी)। जो बिंदु मैं बना रहा हूं वह यह है कि इस कमांड को एसक्यूएल उत्पन्न करना चाहिए (यानी, ओपी ईएफ का उपयोग कर रहा है)। उत्पन्न क्वेरी "चयन करें ... जहां पसंदीदास्पोर्ट =" बेसबॉल "और पसंदीदा रंग ( लाल", "नीला", "हरा") होना चाहिए। आईएन स्टेटमेंट उत्पन्न करने के लिए इसे पूरे संग्रह के माध्यम से फिर से शुरू करना होगा। –

4
string[] FavColor = new string[]{"Green","Red","Blue"}; 

int num = 0; 

    using(var db = new TestDB()) 
    { 
     num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&FavColor.Any(x.FavoriteSport)).Count(); 
    } 

    return num; 
3

। उदाहरण के लिए:

var favoriteColors = new List<string> 
{ 
    "Blue", "Green", "Red" 
}; 
var num = 0; 

using(var db = new TestDB()) 
{ 
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" && favoriteColors.Contains(x.FavoriteColor)).Count(); 
} 

मैं यह सुनिश्चित करने के लिए एक प्रोफ़ाइल जांचूंगा कि जेनरेट एसक्यूएल टीएच इन कथन का उपयोग कर रहा है।

3

जो कुछ भी कहा है, उससे काफी कुछ - आप वैध तारों का संग्रह कर सकते हैं और देख सकते हैं कि आपकी स्ट्रिंग उस संग्रह में है या नहीं। आप इसे इनलाइन कर सकते हैं:

num = db.Table.Count(x => x.FavoriteSport == "Baseball" && 
         new []{"Green","Red","Blue"}.Contains(x.FavoriteColor); 

टिप्पण लायक है कि आप पठनीयता के लिए अपने WhereCount के लिए बाहर सीधे

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