2010-01-26 8 views
7

का उपयोग कर रिकॉर्ड की एक सूची प्राप्त करने मैं सामान्य रूप से की तर्ज पर कुछ करने से पहले ही रिकॉर्ड के लिए जाँच करने के लिए:,इकाई की रूपरेखा - सही तरीका उन्हें

var efCompany = from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a; 

एक भी रिकॉर्ड प्राप्त करने के लिए जब मैं जानता हूँ कि मैं उपयोग कर रहा हूँ पीके इसे पुनः प्राप्त करने, मैं की तरह कुछ का उपयोग करें:

var efCompany = (from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a).First(); 

अब, एक रिकॉर्ड दृष्टिकोण का उपयोग कर, अगर पीके एक दोषपूर्ण मान (जैसे कि यह उद्देश्यपूर्ण परीक्षण में है) 2 लाइन एक त्रुटि फेंकता है।

सर्वोत्तम अभ्यास एक रिकॉर्ड प्राप्त करने और उससे निपटने का तरीका क्या है?

उत्तर

18

उपयोग SingleOrDefault यदि आप 0 या 1, या FirstOrDefault उम्मीद करता है, तो आप सिर्फ संभावित कई से बाहर पहले रिकॉर्ड की जरूरत है, लेकिन प्रकार (आमतौर पर नल) के लिए डिफ़ॉल्ट मान वापस आ जाएगी 0. दोनों के साथ सामना कर सकते हैं अगर कोई हैं परिणाम है।

var efCompany = _dbRiv.Company 
         .Where(a => a.CompanyId == companyFeedInfo.CompanyId) 
         .SingleOrDefault(); 

if (efCompany != null) 
{ 
    // Use it 
} 
else 
{ 
    // Report to user, or whatever 
} 

क्वेरी भाव महान जब आप एकाधिक का उपयोग कर रहे हैं:

वैसे, इस तरह के प्रश्नों आम तौर पर अधिक पठनीय (IMO) एक प्रश्न अभिव्यक्ति का उपयोग करते हुए, तो आप की तरह कुछ हो सकता है बिना कर रहे हैं ऑपरेटर, या अपेक्षाकृत जटिल चीजें जैसे जोड़ना - लेकिन यदि आपके पास है तो को where क्लॉज या मिला को प्रक्षेपण मिला, यह "डॉट नोटेशन" सरल आईएमओ है। यह तब भी बेहतर काम करता है जब आपको अंत में FirstOrDefault जैसी विधि कॉल करने की आवश्यकता होती है।

+0

क्वेरी अभिव्यक्तियों पर अतिरिक्त टिप्पणी के लिए धन्यवाद। अभी भी ईएफ पर बहुत कुछ सीखना और मेरा दिमाग पूरी तरह से लैम्ब्डा सिंटैक्स के चारों ओर लपेटता नहीं है। मुझे बहुत पुराने सी मेमोरी पॉइंटर्स याद दिलाता है। ;) –

+3

'सिंगलऑर्डफॉल्ट 'ईएफ 4 में समर्थित है, लेकिन ईएफ 1 में नहीं।' फर्स्टऑर्डडिल्ट 'दोनों में समर्थित है। –

+0

@ जोन स्कीट - LINQ श्रृंखला पर ऑर्डर बैकवर्ड रखने के बीच क्या अंतर है ... उदा। '_db.MyModels.Where (a => a.Prop ==" मान ")। सिंगलऑर्डफॉल्ट(); 'बनाम' _db.MyModels.SingleOrDefault()। जहां (a => a.Prop == "मान"); '- प्रदर्शन? निष्पादन आदेश? इत्यादि ... –

7

ध्यान दें कि SingleOrDefault() और FirstOrDefault() दोनों आपको डिफ़ॉल्ट मान निर्दिष्ट करने की अनुमति नहीं देंगे।

DefaultIfEmpty() है, जो आपको डिफ़ॉल्ट मान निर्दिष्ट करने की अनुमति देता है यदि आप संख्या में कोई आइटम नहीं हैं। FirstOrDefault() प्राप्त करने के लिए First() (DefaultIfEmpty().First() में) के साथ आप इसे एक नया उदाहरण बनाने और इसे सेट में जोड़ने के लिए लैम्बडा के साथ जोड़ सकते हैं।

यदि आपको केवल रिकॉर्ड के अस्तित्व की जांच करने की आवश्यकता है, तो आप Any() का भी उपयोग कर सकते हैं। हालांकि, यदि परिणाम मौजूद है तो आपको रिकॉर्ड को संसाधित करने की आवश्यकता होने पर दो प्रश्न होंगे।

+0

कोई भी() आपको जाने का सबसे अच्छा तरीका है यदि आपको केवल अस्तित्व की जांच करने की आवश्यकता है। –

+0

'DefaultIfEmpty', जैसे 'सिंगलऑर्डफॉल्ट', ईएफ 4 में समर्थित है लेकिन ईएफ नहीं 1. –

+0

मुझे पता है कि यह 8 साल पुराना है लेकिन उदाहरण का कोई मौका है? – Cloud

1
var efCompany = _dbRiv.Company 
        .SingleOrDefault(a => a.CompanyId == companyFeedInfo.CompanyId); 

if (efCompany != null) 
{ 
    // Use it 
} 
else 
{ 
    // Report to user, or whatever 
} 
0

तुम भी

_dbRiv.Company.find(#id) 

का उपयोग आप देख रहे हैं, अगर उसके शामिल मॉडल के बिना एक रिकार्ड के लिए कर सकते हैं।

या

_dbRiv.Company.FirstOrDefault(x => x.Id == #id); 

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

यदि आप मॉडल में किए गए किसी भी बदलाव को ट्रैक करने की आवश्यकता नहीं है तो भी आप स्मृति खपत में सुधार के लिए AsNoTracking का उपयोग कर सकते हैं।उदाहरण के लिए यदि आप सहेजने के बिना बाकी अनुरोध के माध्यम से इसे वापस कर रहे हैं।

+0

मुझे लगता है कि अगर कोई अनुक्रमणिका है तो उसे पूरी तालिका को स्कैन करने की आवश्यकता नहीं होगी। –

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