2013-08-27 6 views
5

साथ डिफ़ॉल्ट मैं निम्नलिखित कोडएकल या हालत या कहाँ खंड

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 
    .SingleOrDefault(); 

यह रूप में जहां नष्ट इस प्रकार लिखा जा सकता है।

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

कौन सा बेहतर अभ्यास और क्यों है?

+7

जेनरेटेड 'एसक्यूएल' क्वेरी वही होगी, इसलिए मैं कहूंगा कि यह आपकी राय है जो बेहतर है। – MarcinJuraszek

+1

दूसरा छोटा है और अभी भी पढ़ने में आसान है। –

+3

मुझे लगता है कि पहला चरण-दर-चरण कोड का पालन करता है और विस्तार/डीबग करना आसान है। –

उत्तर

1

सबसे पहले आप अंतर को समझने की जरूरत

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 

यह सिर्फ एक प्रश्न बनायेगा लेकिन जब तक आप ToList विधि को कॉल नहीं करेंगे तब तक निष्पादित नहीं होंगे।

सिंगलऑर्डडिल्ट विधि वास्तव में क्वेरी निष्पादित करेगी। इसलिए यदि आप इसे निष्पादित करने से पहले क्वेरी के साथ कुछ जांचना या करना चाहते हैं तो आपको सिंगलऑर्डडिल्ट कहां और फिर कॉल करना चाहिए।

तो कुल मिलाकर, का उपयोग करते हुए, जहां मेरी व्यक्तिगत राय

2

कार्यों की वापसी मान डिबगिंग की जटिलता, और डीबगर में लैम्ब्डा अभिव्यक्ति का उपयोग करते की असंभावना के लिए धन्यवाद, यह सबसे अच्छा तरीका है:

var temp = this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

return temp.SingleOrDefault(); 

इस तरह, अगर वहाँ एक अपवाद पर है SingleOrDefault() (कुछ बहुत आम अगर आप जटिल भाव कर रहे हैं), तो आपको return पर एक ब्रेकपाइंट रख दिया और घड़ी पैनल में कर सकते हैं: temp.ToList();

+3

सभी उचित सम्मान के साथ, यह एक राय है। – Maarten

+1

@ मार्टन मैं इसे पहले हाथ अनुभव कहूंगा :-) मेरा कोड ओपी द्वारा सुझाए गए दो संस्करणों से बेहतर है क्योंकि मेरा एक सत्यापन योग्य लाभ है। परिणामस्वरूप कोड ओपी (आईएल स्तर पर) के बराबर/लगभग बराबर है, यह समान रूप से पठनीय है और डीबग करना आसान है। – xanatos

0

पुरानी पोस्ट के अनुसार अच्छा अभ्यास है और यह काफी हद तक विचार-आधारित है, लेकिन यहाँ से ऊपर नहीं उल्लेख किया एक और विचार है:

एक SingleOrDefault खंड नहीं किया जा सकता Select जैसे अन्य शब्दों के बाद, क्योंकि पटेल ऊपर बताते हैं, यह वास्तव में क्वेरी निष्पादित करता है। उदाहरण के लिए सड़क के नीचे कहते हैं कि तुम सिर्फ ग्राहक के नाम वापस जाने के लिए क्वेरी को संशोधित करना चाहते:

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name); //compile error 

काम नहीं करेगा, और आप SingleOrDefault से पहले करने के लिए Select खंड स्थानांतरित नहीं कर सकते क्योंकि तब Id और CustomerType फ़ील्ड SingleOrDefault में लैम्ब्डा अभिव्यक्ति के लिए दृश्यमान नहीं होंगे। इसके बजाय आप पहली बार वापस जोड़ने के लिए Where खंड आवश्यकता होगी:, यह शायद अच्छा अभ्यास है हमेशा स्थिरता के लिए इसका इस्तेमाल करने के

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name) 
.SingleOrDefault(); 

इस प्रकार क्योंकि Where खंड अक्सर कम से कम के रूप में अच्छा प्रदर्शन जरूरी है और हमेशा की तरह, पठनीयता, और रखरखाव।

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