आपको गलत बताया गया है।
IEnumerable
लिंक से ऑब्जेक्ट्स का उपयोग करेगा, सभी विधियों को मेमोरी में निष्पादित किया जाता है। - IQueryable
विशिष्ट प्रदाता द्वारा लिंक एक्सटेंशन विधियों के जो भी कार्यान्वयन का उपयोग करेगा, उसका उपयोग करेगा। इस मामले में (एक भंडार) मुझे लगता है कि यह संभवतः एक प्रदाता है जो लिंक अभिव्यक्तियों को डेटाबेस स्टेटमेंट्स पर मैप करता है।
इसका मतलब है कि अगर आप IQueryable
का उपयोग करें:
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
गिनती एक प्रश्न "select count(*) from People"
के रूप में डेटाबेस में ही है, यानी पर निर्धारित होता है। यह आमतौर पर बहुत तेज़ है।
आप IEnumerable
का उपयोग करते हैं: जबकि Linq वस्तुओं के लिए संग्रह के माध्यम से पुनरावृत्ति है गिनती निर्धारित करने के लिए
IEnumerable<People> list = repository.FindAllPeople;
int count = list.Count();
सभी लोग उदाहरणों एक करके स्मृति से एक के लिए materialized कर दिया जाएगा। यह बहुत धीमा हो जाएगा और जब भी संभव हो से बचा जाना चाहिए।
नहीं के बाद से सभी विधि कॉल डेटाबेस प्रश्नों में कभी-कभी IEnumerable
उपयोग करने के लिए अपरिहार्य है, लेकिन सभी को छानने, में शामिल होने और समूहीकरण एक IQueryable पर किया जाना चाहिए यदि संभव हो, तो एक अंतिम कदम के रूप में आप AsEnumerable()
उपयोग कर सकते हैं करने के लिए मैप किया जा सकता IEnumerable
और ऑब्जेक्ट्स के लिए लिंक का उपयोग करने के लिए स्विच करने के लिए एक्सटेंशन विधियां।
मेरे मामले में नहीं, एक्सेल दस्तावेज़ पर चलने वाली गणना प्रदर्शन के लिए बहुत अच्छी नहीं है। लगभग 350 पंक्तियों के लिए 300-400ms। यद्यपि आपकी व्याख्या के लिए धन्यवाद। मुझे समझने में मदद मिली कि यह इतना धीमा क्यों है। –