2012-02-12 14 views
10

अगर मैं निम्नलिखित कोड है: -क्यों का उपयोग IQueryable साथ गणना अव्यावहारिक माना जाता है

IQueryable<People> list = repository.FindAllPeople; 
int count = list.Count(); 

तो यह रूप में अव्यावहारिक माना जाता है IQueryable वस्तुओं की गिनती करने के लिए है और यह IEnumerable उपयोग करने के लिए बेहतर है? बीआर

उत्तर

20

आपको गलत बताया गया है।

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 और ऑब्जेक्ट्स के लिए लिंक का उपयोग करने के लिए स्विच करने के लिए एक्सटेंशन विधियां।

+0

मेरे मामले में नहीं, एक्सेल दस्तावेज़ पर चलने वाली गणना प्रदर्शन के लिए बहुत अच्छी नहीं है। लगभग 350 पंक्तियों के लिए 300-400ms। यद्यपि आपकी व्याख्या के लिए धन्यवाद। मुझे समझने में मदद मिली कि यह इतना धीमा क्यों है। –

0

मैं IQueryable की अक्षमता से परिचित नहीं हूं, लेकिन this blog post इंगित करता है कि IQueryable IENumerable के लिए अधिक बेहतर है क्योंकि IQueryable अंतर्निहित अभिव्यक्ति तक पहुंच की अनुमति देता है।

यह केवल एक के मामले में प्रासंगिक हो सकता है कहाँ खंड और नहीं .Count प्रभाव()।