इकाई <ढ्डह्म> टीटीई बनाम लिस्ट <टी> एंटिटी फ्रेमवर्क में


114

मैंने केवल कुछ एंटिटी फ्रेमवर्क अनुप्रयोगों को डिजाइन करने के लिए पहले जाने से पहले कुछ वेबकास्ट देखे। मैंने वास्तव में इतना दस्तावेज़ीकरण नहीं पढ़ा था और मुझे लगता है कि मैं अब इसके लिए पीड़ित हूं।

मैं List<T>अपनी कक्षाओं में उपयोग कर रहा हूं, और इसने बहुत अच्छा काम किया है।

अब मैंने कुछ दस्तावेज पढ़े हैं और यह बताता है कि मुझे इसका उपयोग करना चाहिए था ICollection<T>। मैंने इसे बदल दिया, और यह एक मॉडल संदर्भ परिवर्तन का कारण भी नहीं बना। क्या यह इसलिए है क्योंकि दोनों List<T>और ICollection<T>विरासत है IEnumerable<T>, और वह वही है जो वास्तव में ईएफ के लिए आवश्यक है?

हालाँकि, यदि यह मामला है, तो ईएफ प्रलेखन राज्य को इसकी आवश्यकता क्यों नहीं IEnumerable<T>है ICollection<T>?

किसी भी स्थिति में, मैंने जो भी किया है, क्या उसमें कोई कमी है या मुझे इसे बदलना चाहिए?

जवाबों:


113

एंटिटी फ्रेमवर्क का उपयोग करेगा ICollection<T>क्योंकि इसे Addसंचालन का समर्थन करने की आवश्यकता है , जो IEnumerable<T>इंटरफ़ेस का हिस्सा नहीं है।

यह भी ध्यान दें कि आप उपयोग कर रहे थेICollection<T> , आप इसे केवल List<T>कार्यान्वयन के रूप में उजागर कर रहे थे । List<T>उसके साथ लाता है IList<T>, ICollection<T>और IEnumerable<T>

आपके परिवर्तन के लिए, इंटरफ़ेस के माध्यम से उजागर List<T>करना काम करने के बावजूद एक अच्छा विकल्प है । इंटरफ़ेस अनुबंध को परिभाषित करता है लेकिन कार्यान्वयन नहीं। कार्यान्वयन बदल सकता है। उदाहरण के लिए, कुछ उदाहरणों में, शायद कार्यान्वयन एक हो सकता है HashSet<T>। (यह एक मानसिकता है जिसे आप केवल एंटिटी फ्रेमवर्क से अधिक के लिए उपयोग कर सकते हैं। एक अच्छी वस्तु उन्मुख अभ्यास इंटरफ़ेस की ओर प्रोग्राम करना है और कार्यान्वयन नहीं है। कार्यान्वयन कर सकते हैं और बदल जाएगा।)


2
तो .... बस मेरे लिए थोड़ा और समझने के लिए - सूची में आईलिस्ट विरासत में मिला है, जो कि आइकोलिनेटेशन को विरासत में मिला है, जो IEnumable को विरासत में मिला है?
wil

3
हाँ, वह श्रृंखला है। List<T>उन इंटरफेस (में से प्रत्येक को लागू करने की है IList<T>, ICollection<T>, IEnumerable<T>वंशानुगत पदानुक्रम की वजह से)। पूरा होने के लिए, IList<T>भी गैर सामान्य ऊपर उठाता है IList, ICollectionऔर IEnumerableइंटरफेस।
एंथनी पेग्राम

धन्यवाद ... Ixxx सुविधाओं में से कुछ अभी भी मेरी समझ से बच जाते हैं! आपने समझदारी की है, हालांकि, एक आखिरी चीज जो मुझे परेशान कर रही है, अगर दूसरे Ixx की विरासत IEnumerable है, तो यह IEnumerable को कैसे जोड़ता है यदि एक Ienumerable केवल पढ़ा जाता है? ... अगर यह बहुत जटिल है, तो चिंता न करें, जब मेरे पास थोड़ा समय होगा, तो मैं रिफ्लेक्टर को आग लगाने की कोशिश करूंगा!
wil

10
सामान्य लाइनक ऑपरेशन चीजों को जोड़ते या उत्परिवर्तित नहीं करते हैं, वे बस फ़िल्टर, समूह, परियोजना, आदि फॉरवर्ड-ओनली, केवल-पढ़ने के क्रम ही हैं जो उन कार्यों का समर्थन करने के लिए आवश्यक हैं। जब आपके पास Linq प्रदाता जैसे Entity Framework है जो डेटा दृढ़ता से संबंधित है, तो Add करने की क्षमता एक पर्याप्त लाभ है जो बीफ़ियर इंटरफ़ेस की आवश्यकता है, जो ICollection<T>कि पार्टी को आमंत्रित करता है (और यह इंटरफ़ेस इसके साथ लाता है IEnumerable<T>, इसलिए "सामान्य" "लिनक संचालन अभी भी मान्य हैं)।
एंथनी पेग्राम

@AnthonyPegram: मुझे लगता है कि यह कहना गलत है कि सभी तीन इंटरफेस को लागू किया जाना चाहिए। चूंकि IList <T> को ICollection <T> विरासत में मिला है, जो IEnumerable <T> को विरासत में मिला है, यह सूची <T> के लिए बस IList <T> को लागू करने के लिए पर्याप्त है।
CJ7

51

उन्होंने अपने द्वारा किए गए इंटरफ़ेस को उठाया क्योंकि यह जादू के प्रश्नों पर एक संक्षिप्त अमूर्तता देता है जब आप Linq का उपयोग करते हैं तो Entity Framework प्रदर्शन करता है।

यहाँ इंटरफेस के बीच अंतर है:

  • IEnumerable<T> केवल पढ़ने के लिए है
  • आप आइटम जोड़ सकते हैं और निकाल सकते हैं a ICollection<T>
  • आप रैंडम एक्सेस (इंडेक्स द्वारा) से कर सकते हैं List<T>

उन लोगों में से, ICollectionऔर IEnumerableडेटाबेस संचालन के लिए अच्छी तरह से मैप करते हैं, क्योंकि निकाय को जोड़ने और हटाने / जोड़ने के बाद से आप एक डीबी में कर सकते हैं।

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

ICollection<T> समर्थित है, और आपको डेटा को क्वेरी और बदलने दोनों की अनुमति देगा, इसलिए इसका उपयोग करें।

कारण यह List<T>है कि ईएफ कार्यान्वयन अंत में एक को वापस करने के साथ शुरू होता है। लेकिन यह आपकी क्वेरी श्रृंखला के अंत में है, शुरुआत में नहीं। तो आपके गुणों ICollection<T>को बनाने से यह अधिक स्पष्ट हो जाएगा कि EF SQL का एक गुच्छा बनाता है और केवल एक List<T>अंत में रिटर्न देता है , बजाय इसके कि आप Linq के प्रत्येक स्तर के लिए क्वेरीज़ का उपयोग करें।


8

ICollection IEnumerable से अलग है कि आप वास्तव में संग्रह में आइटम जोड़ सकते हैं, जबकि IEnumerable के साथ आप नहीं कर सकते। उदाहरण के लिए, यदि आप संग्रह में शामिल होने की अनुमति देने का इरादा रखते हैं, तो उदाहरण के लिए, अपने POCO वर्गों में, आप ICollection का उपयोग करना चाहते हैं। आलसी लोडिंग से लाभ के लिए ICollection को आभासी बनाएं।


1
मैं समझना चाहता हूं - आप सूची <T> के साथ एक ही संचालन (और अधिक!) कर सकते हैं। क्यों ICollection <T>? सूची <T> क्यों नहीं? सरल और अधिक शक्तिशाली दिखता है।
मोनस्टरो

सूची <T> इम्प्लीमेंटेशन ICollection और IEnumerable। अधिक ऑपरेशन लेकिन इसके साथ अधिक ओवरहेड आता है।
आयरनएन्स

4

हालाँकि यह प्रश्न वर्षों पहले पोस्ट किया गया था, फिर भी यह वैध है जब कोई उसी परिदृश्य की तलाश में है।

एक हालिया [2015] कोडप्रोजेक्ट लेख है जो नमूना कोड के साथ बहुत विस्तार और चित्रमय प्रतिनिधित्व में अंतर बताता है । यह सीधे ईएफ पर केंद्रित नहीं है, लेकिन फिर भी उम्मीद है कि यह अधिक मदद करेगा:

IEnumerable बनाम IQueryable बनाम ICollection बनाम IDEDIA की सूची

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