90

मुझे एक आइटम के लिए पूछने के विभिन्न तरीकों की तुलना करने के लिए एक समय का शैतान है, और प्रत्येक का उपयोग कब किया जाता है।इकाई फ्रेमवर्क 4 सिंगल() बनाम फर्स्ट() बनाम फर्स्टऑर्डडिफॉल्ट()

क्या किसी के पास ऐसा कोई लिंक है जो इन सभी की तुलना करता है, या एक त्वरित स्पष्टीकरण के रूप में कि आप एक दूसरे का उपयोग क्यों करेंगे? क्या अभी भी अधिक ऑपरेटर हैं जिन्हें मैं अनजान हूं?

धन्यवाद।

उत्तर

157

यहां विभिन्न तरीकों में से एक सिंहावलोकन है:()

  • खोजें - जब आप प्राथमिक कुंजी द्वारा एक आइटम प्राप्त करना चाहते हैं। अगर यह कोई आइटम नहीं मिल पाता है तो यह शून्य हो जाएगा। डेटाबेस में जाने से पहले संदर्भ में यह देखेंगे (जैसा कि टिप्पणियों में यारॉन द्वारा इंगित किया गया है) यदि एक ही संदर्भ को जिंदा होने पर आपको एक ही इकाई को कई बार प्राप्त करने की आवश्यकता होती है तो यह एक महत्वपूर्ण दक्षता कारक हो सकता है।

  • सिंगल() - जब आप किसी प्रश्न से ठीक से एक आइटम वापस लौटने की अपेक्षा करते हैं। यह एक अपवाद फेंक देगा अगर क्वेरी बिल्कुल एक आइटम नहीं लौटाती है।

  • सिंगलऑर्डडिल्ट() - जब आप किसी क्वेरी द्वारा शून्य या एक आइटम को वापस करने की अपेक्षा करते हैं (यानी आप सुनिश्चित नहीं हैं कि किसी दिए गए कुंजी वाला कोई आइटम मौजूद है)। यदि क्वेरी शून्य या एक आइटम वापस नहीं करती है तो यह अपवाद फेंक देगा।

  • पहला() - जब आप किसी एक या अधिक आइटम को किसी क्वेरी द्वारा वापस आने की अपेक्षा करते हैं लेकिन आप केवल अपने कोड में पहले आइटम तक पहुंचना चाहते हैं (ऑर्डरिंग यहां क्वेरी में महत्वपूर्ण हो सकता है)। यदि क्वेरी कम से कम एक आइटम वापस नहीं करती है तो यह अपवाद फेंक देगा।

  • FirstOrDefault() - जैसा कि आप उम्मीद जब शून्य या अधिक आइटम एक प्रश्न द्वारा दिए जाते लेकिन आप केवल (यानी आप यकीन है कि अगर किसी कुंजी के साथ एक आइटम मौजूद नहीं हैं)

    अपने कोड में पहले आइटम का उपयोग करना चाहते हैं
+2

आह, धन्यवाद। फिर भी एक और जो प्रतीत होता है वही काम करता है - लॉल। – asfsadf

+0

क्या आप परिदृश्य के आधार पर सभी 4 का उपयोग करते हैं, या सिर्फ एक के लिए चिपकते हैं? – asfsadf

+1

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

15

यह वास्तव में बहुत आसान है: Single एक ही आइटम देता है और यदि कोई भी या एक से अधिक आइटम नहीं है तो अपवाद फेंक दें। First कोई आइटम नहीं होने पर पहला आइटम लौटाएगा या फेंक देगा। FirstOrDefault कोई आइटम नहीं होने पर पहले आइटम को वापस कर देगा या डिफ़ॉल्ट मान लौटाएगा (जो null है यदि दिए गए प्रकार संदर्भ प्रकार हैं)।

यह एपीआई है जो व्यवहार माना जाता है। ध्यान दें कि अंतर्निहित कार्यान्वयन का एक अलग व्यवहार हो सकता है। जबकि एंटिटी फ्रेमवर्क इसका पालन करता है, एलएलबीएलजेन जैसे ओ/आरएम null को First पर कॉल करते समय भी एक बहुत ही अजीब बात है। डिजाइनर आईएमओ द्वारा यह एक बहुत अजीब (और जिद्दी) निर्णय था।

+0

धन्यवाद स्टीवन। मुझे लगता है कि मैं अभी भी सोच रहा हूं कि आप एक दूसरे के ऊपर क्यों उपयोग करेंगे? मैंने हमेशा FirstOrDefault() का उपयोग किया है, और यह जानकर उत्सुक था कि मैंने देखा कि कई नए उदाहरण एकल() में क्यों स्विच किए गए हैं। क्या सिंगल() पर स्विच करने का कोई कारण है? क्या ऐसे लोग भी हैं जो एक ही चीज़ को पूरा करते हैं, मुझे इसके बजाय विचार करना चाहिए? – asfsadf

+7

यदि आप अपने कोड को "असफल असफल" करने के लिए पसंद करते हैं, तो पहले() और सिंगल() आपके कोड को अधिक सटीक रूप से कहने दें कि क्या अपेक्षित है (इसलिए यह अन्यथा विफल हो सकता है) –

+3

मैं पूरी तरह फ्रैंक से सहमत हूं। यह इरादा संवाद के बारे में भी है। 'सिंगल' स्पष्ट रूप से व्यक्त करता है कि आप केवल परिणाम को एक तत्व होने की उम्मीद करते हैं। – Steven

8

प्रत्येक के चार तरीकों में उनकी जगह है; यद्यपि आप वास्तव में केवल दो अलग-अलग संचालन करते हैं।

  • पहला - एक परिणाम सेट की अपेक्षा जिसमें कई आइटम हैं, मुझे उस सेट में पहला आइटम दें।
  • सिंगल - एक परिणाम की अपेक्षा वापस, मुझे वह आइटम दें।

xxxxOrDefault() संस्करण सिर्फ "मैं एक खाली परिणाम सेट को एक असाधारण परिस्थिति के रूप में नहीं मानना ​​चाहता हूं।"

+0

ठीक है, तो मुझे ऐसा लगता है कि पहले() शायद ही कभी काम में आ जाएगा। मुझे एक परिदृश्य के साथ आने में मुश्किल हो रही है जहां सिंगल() पहला विकल्प नहीं होगा। मौका से आपके पास हाथ से एक त्वरित हाथ है? धन्यवाद। – asfsadf

+3

दुर्भाग्यवश बहुत से डेवलपर पहले() या फर्स्टऑर्डडिफॉल्ट() को एक रक्षात्मक उपाय के रूप में उपयोग करते हैं, सोचते हैं कि यह एक अपवाद से बच जाएगा जब वास्तव में वास्तविक समस्याओं को छिपाने की क्षमता होगी। –

16

मैं हमेशा फर्स्टऑर्डडिफॉल्ट का उपयोग करता हूं। यदि आप वास्तव में प्रदर्शन के साथ चुनिंदा होना चाहते हैं तो आपको ईएफ में फर्स्टऑर्डडिल्ट का उपयोग करना चाहिए। कवर के तहत सिंगलऑर्डफॉल्ट क्वेरी में शीर्ष (2) का उपयोग करता है क्योंकि इसे जांचना होगा कि क्या है एक दूसरी पंक्ति है कि मापदंड से मेल खाने और अगर यह होता है, यह एक अपवाद फेंकता है। मूल रूप से SingleOrDefault में आप कह रहे हैं कि यू अगर आपकी क्वेरी तो अधिक 1 रिकॉर्ड रिटर्न एक अपवाद फेंकने के लिए परवाह है।

+4

क्या आपने कभी भी 'फर्स्टऑर्डडिफॉल्ट' और 'सिंगलऑर्डफॉल्ट' के बीच प्रदर्शन अंतर को महत्वपूर्ण बताया है? मैं कहूंगा कि ज्यादातर मामलों में यह समयपूर्व अनुकूलन है। – Steven

+1

[इस आदमी ने किया] (http://stackoverflow.com/a/8265919/634824) –

0

एकल() और सिंगलऑर्डिफॉल्ट() आमतौर पर आईडी जैसे अद्वितीय पहचानकर्ताओं पर उपयोग किया जाता है, जबकि पहले() या फर्स्टऑर्डडिफॉल्ट() आमतौर पर एक क्वेरी के लिए उपयोग किया जाता है जिसमें कई परिणाम हो सकते हैं लेकिन आप केवल "शीर्ष 1" चाहते हैं।

एकल() या पहले() एक अपवाद है, तो कोई परिणाम दिया जाता है, SingleOrDefault फेंक() और FirstOrDefault() कैच अपवाद और रिटर्न अशक्त या डिफ़ॉल्ट (ResultDataType)।

1

दूसरी ओर, आप, मुख्य तर्क के आधार पर इन तरीकों विभाजित कर सकते हैं इस तरह: एकल(), SingleOrDefault(), सबसे पहले(), FirstOrDefault:

  • विधि डेटाबेस सीधे क्वेरी करेगा()
  • विधि भी डेटाबेस के खिलाफ क्वेरी जारी करने से पहले कैश में एक खोज प्रदर्शन करेंगे: खोजें()

कुछ प्रदर्शन जानकारी के लिए, विशेष रूप से दूसरी स्थिति में आप यहां देख सकते हैं: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

इसके अलावा, पहले समूह में आप जटिल क्वेरी परिभाषित कर सकते हैं, लेकिन साथ खोजें() विधि आप केवल इकाई प्रदान कर सकते हैं खोज के लिए कुंजी।

संबंधित मुद्दे