2010-07-15 15 views
31

यदि मेरे पास एक linq क्वेरी है जो इस तरह दिखती है, तो मैं यह देखने के लिए कैसे जांच सकता हूं कि क्वेरी द्वारा कोई परिणाम नहीं मिला है या नहीं?यदि लिंक परिणाम खाली है

var LinqResult = 
    from a in Db.Table 
    where a.Value0 == "ninja" 
    group a by a.Value1 into b 
    select new { Table = b}; 

if(LinqResult.Count() == 0) //? 
{ 

} 
+35

आप निंजा की खोज करने के लिए परेशान क्यों हैं? बस मान लें कि आप कोई नहीं ढूंढ सकते हैं। कभी। – dlras2

उत्तर

82

आप चाहे एक दृश्य खाली है या नहीं की जाँच करने के एक तरीके के रूप Count() विधि का उपयोग कर से बचने के लिए प्रयास करना चाहिए। फिल हैक में an excellent article on his blog है जहां उन्होंने इस एंटीपार्टर्न पर चर्चा की।

Count() वास्तव में अनुक्रम के सभी तत्वों का आकलन करना चाहिए - यदि अनुक्रम एकाधिक LINQ संचालन (या डेटाबेस से आता है) पर आधारित है तो महंगा हो सकता है।

आपको इसके बजाय Any() एक्सटेंशन विधि का उपयोग करना चाहिए - जो केवल यह देखने का प्रयास करता है कि सूची में कम से कम एक तत्व है, लेकिन पूरे अनुक्रम की गणना नहीं करेगा।

if(!LinqResult.Any()) 
{ 
    // your code 
} 

व्यक्तिगत रूप से, मैं यह भी लगता है कि के Any() बल्कि Count() की तुलना में बेहतर उपयोग अपने इरादे को व्यक्त करता है, और refactor या भविष्य में मज़बूती से बदलने के लिए आसान है।

वैसे, यदि आप वास्तव में चाहते हैं कि अनुक्रम का पहला (या केवल) सदस्य है तो आपको इसके बजाय First() या Single() ऑपरेटरों का उपयोग करना चाहिए।

+1

लेख की अंतर्दृष्टि के बावजूद कि 'कोई()' केवल कॉल करता है '.MoveNext()' एक बार, ReSharper (7) 'ANny()' का उपयोग करते समय संभावित समीकरणों के बारे में शिकायत करेगा, इसके बाद अन्य गणना विधियों के बाद। शायद ReSharper गलत है या उच्च दक्षता के लिए लक्ष्य है। –

+0

@ करलग: LINQ डेटा के सभी स्रोत आलसी नहीं हैं, यही कारण है कि 'कोई भी() 'महंगा हो सकता है। (उदाहरण के लिए, 'ऑर्डरबी' परिणाम पर, यह किसी भी समय सहेज नहीं पाएगा) –

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