2009-03-20 13 views
66

जब एक से अधिक के साथ एक LINQ क्वेरी "और" की स्थिति लेखन, मैं && या एकाधिक where खंड, प्रत्येक conditon के लिए एक वाली एकल where खंड लिखना चाहिए?क्या मुझे अपने LINQ क्वेरी में दो "कहां" खंड या "&&" का उपयोग करना चाहिए?

static void Main(string[] args) 
{ 
    var ints = new List<int>(Enumerable.Range(-10, 20)); 

    var positiveEvensA = from i in ints 
         where (i > 0) && ((i % 2) == 0) 
         select i; 

    var positiveEvensB = from i in ints 
         where i > 0 
         where (i % 2) == 0 
         select i; 

    System.Diagnostics.Debug.Assert(positiveEvensA.Count() == 
             positiveEvensB.Count()); 
} 

वहाँ कोई अंतर positiveEvensA और positiveEvensB के बीच व्यक्तिगत पसंद या कोडिंग शैली (लंबी लाइनों, पठनीयता, आदि) के अलावा अन्य है?

दिमाग में आने वाला एक संभावित अंतर यह है कि विभिन्न LINQ प्रदाता अधिक जटिल अभिव्यक्ति के बजाय कई where एस के साथ बेहतर ढंग से सामना करने में सक्षम हो सकते हैं; क्या ये सच है?

उत्तर

45

मैं व्यक्तिगत रूप से हमेशा & & बनाम दो जहां खंड जब भी यह बयान अस्पष्ट नहीं है के साथ जाना होगा।

आपके मामले में, शायद यह बिल्कुल ध्यान नहीं दिया जाएगा, लेकिन यदि आपके पास एक बड़ा संग्रह है, और यदि आप इस क्वेरी से सभी परिणामों का उपयोग करते हैं तो क्लॉज निश्चित रूप से प्रदर्शन प्रभाव डालेंगे। उदाहरण के लिए, यदि आप परिणामों पर .Count() को कॉल करते हैं, या पूरी सूची के माध्यम से पुनरावृत्त करते हैं, तो पहला जहां खंड चल जाएगा, एक नया आईनेमरेबल तैयार करेगा जिसे दूसरे प्रतिनिधि के साथ फिर से समझा जाएगा।

दो खंडों को एक साथ जोड़ना क्वेरी को एक प्रतिनिधि को बनाने का कारण बनता है जो संग्रह के रूप में चलाया जाता है। इसका परिणाम संग्रह के माध्यम से एक गणना में होता है और प्रत्येक बार परिणाम लौटाए जाने पर प्रतिनिधि को एक कॉल होता है।

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

आप 2 जहां खंड का उपयोग करने, रखने और अधिक प्रतिबंधात्मक खंड पहले काफ़ी मदद मिलेगी, दूसरी जहां खंड केवल तत्व है कि पहले एक पारित पर चलाया जाता है के बाद से फैसला करते हैं।

अब, आपके मामले में, इससे कोई फर्क नहीं पड़ता। एक बड़े संग्रह पर, यह हो सकता है। अंगूठे का एक सामान्य नियम के रूप में, मैं के लिए जाना:

1) पठनीयता और रख-रखाव

2) प्रदर्शन

इस मामले में, मुझे लगता है कि दोनों विकल्पों समान रूप से पोषणीय हैं, तो मैं के लिए जाना चाहते हैं अधिक प्रदर्शन विकल्प।

+29

"कहाँ" खंड, कि अभी तक केवल प्रति मद 2 प्रतिनिधि कॉल के साथ एक एकल पुनरावृत्ति है। –

+4

मार्क, जब मैं दो पुनरावृत्तियों कहता हूं, तो मुझे और अधिक स्पष्ट होना चाहिए था। 2 खंडों के साथ, आप दो अलग-अलग गणक बनाते हैं - पहला जहां एक गणक बनाता है जिसे दूसरे द्वारा गणना की जाती है। लेकिन यह बहुत मामूली है-यह 2 लूप नहीं कर रहा है, बस अलग एन्युमरेटर्स के साथ गिनती है। –

+2

मुझे लगता है कि जहां कहां है, वहां कई कहां के लिए कुछ विशेष अनुकूलन हैं। फिर भी यह कई प्रतिनिधि आमंत्रणों के कारण धीमा हो जाएगा। – CodesInChaos

18

यह ज्यादातर व्यक्तिगत शैली का मुद्दा है। व्यक्तिगत रूप से, जब तक कि एक पंक्ति पर जहां खंड फिट बैठता है, मैं खंडों को समूहित करता हूं।

एकाधिक कहां उपयोग करना कम प्रदर्शन करने वाला होता है क्योंकि इसे हर तत्व के लिए एक अतिरिक्त प्रतिनिधि आमंत्रण की आवश्यकता होती है जो इसे दूर करता है। हालांकि यह एक महत्वहीन मुद्दा होने की संभावना है और केवल तभी विचार किया जाना चाहिए जब कोई प्रोफाइलर इसे एक समस्या दिखाता है।

1

दूसरों की तरह सुझाव दिया गया है, यह एक व्यक्तिगत वरीयता है। मुझे & & का उपयोग पसंद है क्योंकि यह अधिक पठनीय है और अन्य मुख्यधारा भाषाओं के वाक्यविन्यास की नकल करता है।

3

प्रदर्शन समस्या केवल स्मृति आधारित संग्रह पर लागू होती है ... SQL से लिंक SQL अभिव्यक्ति पेड़ उत्पन्न करता है जो निष्पादन को रोकता है। अधिक यहाँ विवरण: - नहीं 2 पुनरावृत्तियों दावा किया

Multiple WHERE Clauses with LINQ extension methods

2 के साथ
संबंधित मुद्दे