2012-09-22 20 views
15

बिना dbSet में एक रिकॉर्ड ढूँढें का उपयोग कर खोजें मैं एक उपयोगकर्ता तालिका है:एक प्राथमिक कुंजी

Users: 
+ID 
+Username 
+... 

मैं myDBContext.Users.Find(Username) उपयोग करने के लिए एक उपयोगकर्ता पंख करना चाहते हैं। मेरे वर्तमान संदर्भ में मैं अपनी आईडी का उपयोग नहीं कर सकता।

क्या मुझे एक पूर्ण LINQ क्वेरी का उपयोग करना है? जैसे

var user = from users in myDBContext.Users.Find(Username) 
      where users.Username == username 
      select users 

मैं अपने edmx में एक प्राथमिक कुंजी के रूप उपयोगकर्ता नाम को परिभाषित करने की कोशिश की है लेकिन यह है कि निम्न त्रुटि के परिणामस्वरूप:

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

उत्तर

35

कोशिश करें,

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username); 

का उपयोग करेंSingle का इंस्टॉलेशन। यदि उपयोगकर्ता मौजूद नहीं है तो Single एक त्रुटि फेंक देगा। जबकि SingleOrDefaultnull वापस करेगा यदि उपयोगकर्ता अन्यथा नहीं मिला User ऑब्जेक्ट वापस आ जाएगा।

चयन SingleOrDefault बीच और FirstOrDefault

आप SingleOrDefault और FirstOrDefault का उपयोग करके लेकिन जब चयन जो विधि उपयोगकर्ता वस्तु प्राप्त कर सकते हैं अंक नीचे पर विचार का उपयोग करें।

  • दोनों संग्रह या डेटाबेस से केवल एक मान लौटाते हैं यदि अन्यथा डिफ़ॉल्ट मान मौजूद है।
  • लेकिन यदि आपके पास एक ही नाम वाले एक से अधिक उपयोगकर्ता हैं और आप LINQ क्वेरी करते समय अपवाद प्राप्त करने की उम्मीद कर रहे हैं तो SingleOrDefault का उपयोग करें क्योंकि यदि एक से अधिक तत्व उपलब्ध हैं तो यह अपवाद फेंक देगा।
  • और यदि आप अपवाद नहीं चाहते हैं और/या आप यह नहीं देखना चाहते हैं कि आपके संग्रह/डेटाबेस में डेटा का डुप्लिकेशन है, तो संग्रह/डेटाबेस से पहले मान प्राप्त करना चाहते हैं तो का बेहतर प्रदर्शन के लिए SingleOrDefault की तुलना करें

FirstOrDefault

  • आम तौर पर FirstOrDefault या First जब हम एकल मान (प्रथम) संग्रह या डेटाबेस से आवश्यक हुआ करता था।
  • मुट्ठी/फर्स्टऑर्डडिफॉल्ट के मामले में, डेटाबेस से केवल एक पंक्ति पुनर्प्राप्त की जाती है, इसलिए यह सिंगल/सिंगलऑर्डफॉल्ट से थोड़ा बेहतर प्रदर्शन करती है। इस तरह का एक छोटा अंतर शायद ही ध्यान देने योग्य है लेकिन जब तालिका में बड़ी संख्या में कॉलम और पंक्ति होती है, तो इस समय प्रदर्शन ध्यान देने योग्य होता है।

कुछ अन्य टिप्पणी

  • हैं username प्राथमिक कुंजी है तो मुझे लगता है कि वहाँ कोई ज्यादा/SingleOrDefault और प्राथमिक कुंजी के रूप FirstOrDefault प्रदर्शन के बीच कोई अंतर सूचकांक है हो सकता है और हमेशा होगा सूचकांक स्तंभ पर खोज करेंगे सामान्य कॉलम से तेज हो।
  • Single या SingleOrDefault एक नियमित TSQL जैसे "चयन ..." उत्पन्न करेगा।
  • First या FirstOrDefault विधि उत्पन्न होगा की तरह TSQL बयान "का चयन टॉप 1 ..."
+0

और भी बेहतर! .. धन्यवाद। – Mortalus

+0

इसके बजाय 'FirstOrDefault' का उपयोग करना बेहतर नहीं होगा? 'सिंगलऑर्डफॉल्ट' विधि की मेरी समझ यह है कि यह सुनिश्चित करने के लिए * पूरे * तालिका को ब्राउज़ करेगा कि केवल एक रिकॉर्ड स्थिति से मेल खाता है। ऐसा नहीं हो सकता है कि ओपी चाहता है। – Crono

+1

@ क्रोनो हां आप FirstOrDefault के लिए सही हैं अगर हम सिंगलऑर्डफॉल्ट की तुलना में इसके प्रदर्शन पर विचार करते हैं। लेकिन यहां मुझे लगता है कि अपेक्षित परिणाम के आधार पर हमें इन दो तरीकों के बीच चयन करना चाहिए। यदि आप केवल एक ही परिणाम चाहते हैं और यदि आप एक से अधिक अनुक्रमों का उपयोग करते हैं तो आप अपवाद की उम्मीद कर रहे हैं तो सिनलऑरडिफॉल्ट का उपयोग करें अन्यथा FirstOrDefault का उपयोग करें। मैं इस संदर्भ के साथ अपना जवाब अपडेट करूंगा। –

3

मैंने पाया यह:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username); 
+0

हाँ, यह ठीक है, लेकिन चूंकि यह आपकी समस्या के लिए समाधान है आप जवाब के रूप में स्वीकार करना चाहिए। –

+0

वैसे यह मुझे बताता है कि मैं इसे केवल दो दिनों में स्वीकार कर सकता हूं इसलिए मैं इंतजार करूंगा .. tnx – Mortalus

+0

@ मॉर्टलस अगर आपके प्रश्न में मदद करता है तो मेरा जवाब ढूंढें। मैंने सिंगल टू सिंगलऑर्डफॉल्ट को बदल दिया। –

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