इकाई फ्रेमवर्क 4 सिंगल () बनाम पहले () बनाम फर्स्टऑर्डफॉल्ट ()


119

मैं किसी एक आइटम के लिए क्वेरी करने के लिए अलग-अलग तरीकों की तुलना करने और प्रत्येक का उपयोग करने के समय का एक शैतान हूं।

क्या किसी के पास एक लिंक है जो इन सभी की तुलना करता है, या एक त्वरित व्याख्या करता है कि आप दूसरे पर एक का उपयोग क्यों करेंगे? क्या अब भी अधिक संचालक हैं जिनसे मैं अनजान हूं?

धन्यवाद।

जवाबों:


205

यहाँ विभिन्न तरीकों का अवलोकन किया गया है:

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

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

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

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

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


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

1
धन्यवाद। मैं अपने आप को पहले () अब और नहीं देख सकता, जहां सिंगल () बेहतर नहीं होगा। यदि मैं कम घना था, तो मुझे यकीन है कि मैं पहले () अभी भी उपयोग करने के लिए सराहना / समझ सकता हूं।
asfsadf

1
पहले () उस मामले में सबसे अधिक समझ में आता है जहां आप केवल उस वस्तु को उच्चतम या निम्नतम के साथ प्राप्त करना चाहते हैं जिसे आप ऑर्डर कर रहे हैं। उदाहरण के लिए, मुझे उच्चतम कुल मूल्य के साथ बिक्री का पता लगाएं। Sales.OrderByDescending(s => s.TotalValue).First();
माइक चेम्बरलेन

5
सभी टिप्पणियों में एक महत्वपूर्ण अंतर दिखता है। ढूँढें () एकमात्र तरीका है जो db को हिट करने से पहले संदर्भ को खोजता है।
यारोन लेवी '

5
एक अन्य बिंदु यह है कि एक sql डेटाबेस को क्वेरी करते समय , Singleया SingleOrDefault2 रिकॉर्ड्स (सीमा 2) के लिए क्वेरी करेगा Firstया FirstOrDefault1 (सीमा 1) के लिए क्वेरी करेगा।
बार्ट कैलिक्सो

22

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


5
क्या तुमने कभी के प्रदर्शन के बीच अंतर मापा जाता है FirstOrDefaultऔर SingleOrDefaultमहत्वपूर्ण होने के लिए? मैं कहूंगा कि यह ज्यादातर मामलों में समय से पहले अनुकूलन है।
स्टीवन

मैं उपयोग करता हूं Single()या SingleOrDefault()जब मैं कुछ वापस करता हूं जिसमें केवल एक ही मौजूद होना चाहिए । मेरे द्वारा ऐसा किए जाने का कारण बुरी तरह से लिखित प्रश्न बनाकर बग को पहचानना है, जो कि उनकी तुलना में अधिक वापसी करते हैं, असफल होते हैं। कम से कम मेरे दिमाग में, यह सिस्टम में डेटा को सुसंगत रखने में मदद करेगा। बेशक यह धीमी है, लेकिन मुझे लगता है कि यह बहुत धीमी नहीं है, और मैं उस कीमत का भुगतान करने को तैयार हूं।
मोर्टब

15

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

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


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

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

3
मैं फ्रैंक से पूरी तरह सहमत हूं। यह इरादे को संप्रेषित करने के बारे में भी है। Singleस्पष्ट रूप से व्यक्त करता है कि आप केवल एक तत्व के परिणाम की अपेक्षा करते हैं।
स्टीवन

8

चार विधियों में से प्रत्येक का अपना स्थान है; हालांकि आपके पास वास्तव में केवल दो अलग-अलग ऑपरेशन हैं।

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

XxxxOrDefault () संस्करण बस पर जोड़ता है "मैं एक असाधारण परिस्थिति के लिए खाली परिणाम पर विचार नहीं करना चाहता।"


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

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

3

दूसरी तरफ, आप इन तरीकों को मुख्य तर्क द्वारा विभाजित कर सकते हैं, जैसे:

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

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

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


0

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

सिंगल () या फ़र्स्ट () कोई अपवाद नहीं छोड़ता है यदि कोई परिणाम वापस नहीं होता है, तो सिंगलऑर्डेफ़ॉल्ट () और फ़र्स्टऑर्डडेफ़ॉल्ट () अपवाद को पकड़ता है और अशक्त या डिफ़ॉल्ट (ResultDataType) देता है।

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