IQueryable और IEnumerable के बीच क्या अंतर है


150

मैं अंतर के रूप में उलझन में हूँ। .Net के लिए काफी नया होने के नाते, मुझे पता है कि मैं IEnumerablesLinq एक्सटेंशन का उपयोग करके क्वेरी कर सकता हूं । तो यह क्या है IQueryableऔर यह कैसे भिन्न होता है?


यह भी देखें कि IQueryable [T] और IEnumerable [T] में क्या अंतर है? इस प्रश्न के साथ ओवरलैप होता है।

जवाबों:


186

IEnumerable<T>के केवल आगे के कर्सर का प्रतिनिधित्व करता है T। .NET 3.5 विस्तार तरीकों कि शामिल जोड़ा LINQ standard query operatorsकी तरह Whereऔर First, किसी भी ऑपरेटरों कि विधेय या लेने अनाम प्रक्रियाएं की आवश्यकता के साथ Func<T>

IQueryable<T>एक ही LINQ मानक क्वेरी ऑपरेटरों को लागू करता है, लेकिन Expression<Func<T>>विधेय और अनाम कार्यों के लिए स्वीकार करता है। Expression<T>एक संकलित अभिव्यक्ति ट्री है, विधि का टूटा हुआ संस्करण (यदि आप चाहें तो "आधा संकलित") जिसे क्वेरी करने वाले के प्रदाता द्वारा पार्स किया जा सकता है और तदनुसार उपयोग किया जा सकता है।

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

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

पहले ब्लॉक में, x => x.Age > 18एक अनाम विधि ( Func<Person, bool>) है, जिसे किसी अन्य विधि की तरह निष्पादित किया जा सकता है। Enumerable.Whereप्रत्येक व्यक्ति के लिए एक बार विधि निष्पादित करेगा, उन yieldमानों को सम्‍मिलित करेगा जिनके लिए विधि वापस लौटी true

दूसरे ब्लॉक में, x => x.Age > 18एक एक्सप्रेशन ट्री ( Expression<Func<Person, bool>>) है, जिसे "एज 'प्रॉपर्टी> 18" माना जा सकता है।

यह LINQ-to-SQL जैसी चीजों को मौजूद करने की अनुमति देता है क्योंकि वे अभिव्यक्ति ट्री को पार्स कर सकते हैं और इसे समकक्ष SQL में बदल सकते हैं। और क्योंकि प्रदाता जब तक निष्पादित करने के लिए की जरूरत नहीं है IQueryable(यह औजार प्रगणित है IEnumerable<T>, सब के बाद), यह कई क्वेरी ऑपरेटरों (ऊपर के उदाहरण में गठजोड़ कर सकते हैं Whereऔर FirstOrDefault) कैसे अंतर्निहित डेटा के खिलाफ संपूर्ण क्वेरी को निष्पादित करने पर बेहतर विकल्प चुनने के लिए source (जैसे SELECT TOP 1SQL में उपयोग करना )।

देख:


1
बहुत संक्षिप्त उत्तर
ashveli

83

वास्तविक जीवन में, यदि आप LINM-to-SQL जैसे ORM का उपयोग कर रहे हैं

  • यदि आप एक बनाते हैं IQueryable, तो क्वेरी को sql में परिवर्तित किया जा सकता है और डेटाबेस सर्वर पर चलाया जा सकता है
  • यदि आप एक बनाते हैं IEnumerable, तो क्वेरी चलाने से पहले सभी पंक्तियों को ऑब्जेक्ट के रूप में मेमोरी में खींच लिया जाएगा।

दोनों मामलों में यदि आप कॉल नहीं करते हैं ToList()या ToArray()फिर क्वेरी का उपयोग होने पर हर बार निष्पादित किया जाएगा, तो, कहें, आपके पास एक है IQueryableऔर आप इसमें से 4 सूची बॉक्स भरते हैं, फिर क्वेरी को डेटाबेस के खिलाफ 4 बार चलाया जाएगा।

यदि आप अपनी क्वेरी बढ़ाते हैं:

q.Select(x.name = "a").ToList()

फिर एक IQueryableउत्पन्न SQL के साथ होगा where name = "a", लेकिन IEnumerableकई और भूमिकाओं के साथ डेटाबेस से वापस खींच लिया जाएगा, फिर x.name = "a".NET द्वारा चेक किया जाएगा।


"क्वेरी को sql में बदला जा सकता है": मुझे 'हो सकता है' नहीं मिला। इसके अलावा, अगर मेरे पास एक IEnumerable है और IQueryable के विपरीत एक (जटिल श्रृंखला) तो (जाहिर है) बनाएं, इसे 'अनुकूलित' एसक्यूएल क्वेरी में अनुवादित नहीं किया जाएगा। बस यह पुष्टि करना चाहते हैं कि जब आप कहते हैं कि इसका मतलब क्या है 'सभी पंक्तियों को स्मृति में खींच लिया जाएगा'। हम कहते हैं कि मेरे पास दो जगह हैं जहां क्लॉस हैं, तो क्या सभी टुपल्स को पहले मेमोरी में लाया जाएगा और फिर 'इन-मेमोरी' फ़िल्टरिंग सामान्य होगी?
वैभव

36

"प्राथमिक अंतर यह है कि IQueryable के लिए परिभाषित विस्तार विधियां फंक वस्तुओं के बजाय अभिव्यक्ति वस्तुओं को लेती हैं, जिसका अर्थ यह है कि यह जो प्रतिनिधि प्राप्त करता है वह आह्वान करने की विधि के बजाय एक अभिव्यक्ति पेड़ है। IEnumerable इन-मेमोरी संग्रह के साथ काम करने के लिए महान है, लेकिन IQueryable अनुमति देता है। दूरस्थ डेटा स्रोत के लिए, डेटाबेस या वेब सेवा की तरह "

स्रोत: यहाँ


19

IEnumerable IEnumerable इन-मेमोरी संग्रह के साथ काम करने के लिए सबसे उपयुक्त है। IEnumerable वस्तुओं के बीच नहीं चलता है, यह केवल संग्रह के लिए आगे है।

एक डेटाबेस या वेब सेवा की तरह दूरस्थ डेटा स्रोत के लिए IQueryable IQueryable सबसे अच्छा सूट करता है। IQueryable एक बहुत शक्तिशाली विशेषता है जो विभिन्न प्रकार के दिलचस्प आस्थगित निष्पादन परिदृश्यों (जैसे पेजिंग और रचना आधारित क्वेरी) को सक्षम करता है।

इसलिए जब आपको इन-मेमोरी संग्रह के माध्यम से पुनरावृति करना हो, तो IEnumerable का उपयोग करें, यदि आपको डेटासेट और अन्य डेटा स्रोतों जैसे संग्रह के साथ कोई हेरफेर करने की आवश्यकता है, तो IQueryable का उपयोग करें


11

सिद्धांत अंतर यह है कि IEnumerable हर समय अपने सभी तत्वों की गणना करेगा, जबकि IQueryable किसी क्वेरी के आधार पर तत्वों की गणना करेगा, या अन्य चीजें भी करेगा। क्वेरी एक अभिव्यक्ति (.Net कोड का एक डेटा प्रतिनिधित्व) है, जो एक IQueryProvider परिणाम उत्पन्न करने के लिए / व्याख्या / संकलन / जो कुछ भी पता लगाना चाहिए।

एक क्वेरी अभिव्यक्ति होने से दो फायदे मिलते हैं।

पहला लाभ अनुकूलन है। क्योंकि 'जहाँ' जैसे संशोधक क्वेरी अभिव्यक्ति में शामिल हैं, IQueryProvider अन्यथा असंभव अनुकूलन को लागू कर सकता है। सभी तत्वों को वापस करने के बजाय एक 'जहां' खंड के कारण उनमें से अधिकांश को फेंक देना, प्रदाता किसी दिए गए कुंजी के साथ आइटम का पता लगाने के लिए हैश टेबल का उपयोग कर सकता है।

दूसरा फायदा लचीलापन है। क्योंकि एक्सप्लेनेशन एक्सप्लेनेटिव डेटा स्ट्रक्चर्स हैं, आप क्वेरी को सीरीज़ कर सकते हैं और इसे रिमोट मशीन पर भेज सकते हैं (जैसे। linq-to-sql)।



1

सबसे पहले IEnumerable एक System.Collections Namespace में पाए जाते हैं, जबकि IQueryable एक System.Linq Namespace में पाए जाते हैं। यदि आप सूची, सरणी संग्रह आदि जैसे मेमोरी संग्रह से डेटा क्वेरी करते समय और आउट-मेमोरी (जैसे दूरस्थ डेटाबेस, सेवा) संग्रह से डेटा क्वेरी करते समय IEnumerable का उपयोग कर रहे हैं तो आप IQueryable का उपयोग कर रहे हैं। डेटाबेस से डेटा क्वेरी करते समय, IEnumerable सर्वर साइड पर चुनिंदा क्वेरी निष्पादित करता है, क्लाइंट साइड पर डेटा इन-मेमोरी लोड करता है और फिर डेटा फ़िल्टर करता है। इसलिए अधिक काम करता है और धीमा हो जाता है। डेटाबेस से डेटा क्वेरी करते समय, IQueryable सभी फ़िल्टर के साथ सर्वर साइड पर चुनिंदा क्वेरी को निष्पादित करता है। इसलिए कम काम करता है और तेज हो जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.