2010-11-04 19 views
24

संदर्भ पूछने के इन दो तरीकों के बीच कोई अंतर है?इकाई फ्रेमवर्क। जहां विधि चेनिंग

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId) 
      .Where(f => f.AnotherId == anotherId) 
      .FirstOrDefault(); 

Firm firm = base.context.Firms 
      .Where(f => f.SomeId == someId && f.AnotherId == anotherId) 
      .FirstOrDefault(); 

ऐसा लगता है कि चेनिंग और स्थिति को पूरा करने के लिए पूरी तरह ठीक है। मुझे विश्वास नहीं है कि आप श्रृंखला या बयान कर सकते हैं। क्या किसी एक को बेहतर बनाने के लिए कोई कारण है, या परिदृश्य जब कोई बेहतर/अधिक कुशल होता है?

उत्तर

34

उन्हें दोनों एक ही अंतिम परिणाम (यदि मुझे गलत नहीं है) का उत्पादन करना चाहिए, लेकिन मुझे लगता है कि दूसरा अधिक पठनीय और बेहतर मूल उद्देश्य दिखाता है।


अद्यतन

मैं सिर्फ ऊपर बयान LINQPad का उपयोग कर सत्यापित। वास्तव में, दोनों प्रश्न एक ही एसक्यूएल उत्पाद करेंगे।

उदाहरण के लिए:

context.SomeTable.Where(c => c.ParentId == null) 
       .Where(c => c.Name.Contains("F")) 
       .Select(c => c.Name); 

का उत्पादन:

SELECT [t0].[Name] 
FROM [SomeTable] AS [t0] 
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[ParentId] IS NULL) 

कौन सा एक ही एसक्यूएल कि द्वारा निर्मित है है:

context.SomeTable.Where(c => c.ParentId == null && c.Name.Contains("F")) 
       .Select(c => c.Name); 



आप कर सकते थे भी कॉम्पैक्ट बातें थोड़ा और अधिक (जो मैं उपर दिए गए कारणों के लिए बेहतर लगता है):

var firm = base.context.Firms.FirstOrDefault(f => f.SomeId == someId 
                && f.AnotherId == anotherId); 
+1

लिनपैड के लिए – TGnat

+0

+1 के लिए +1। – Omar

+5

पहला सबसे ज्यादा मेरे लिए पठनीय है। आप तुरंत देख सकते हैं कि दो अलग-अलग स्थितियां हैं जो मेल खाना चाहिए और वे पूरी तरह से लाइन अप करें। निश्चित रूप से दूसरे के पास दो स्थितियां भी हैं लेकिन लाइन में एक && है कि यह पता लगाने के लिए अतिरिक्त सेकंड लेता है। LINQPad के लिए – Ryan

0

आप कोड के माध्यम से डीबग कर सकते हैं और प्रत्येक के परिणामस्वरूप उत्पन्न होने वाले एसक्यूएल को देख सकते हैं। मुझे लगता है कि यह एक ही प्रश्न में बदल जाता है।

2

मेरा अनुमान है कि जब तक आप IQueryable में साथ काम कर रहे है कि (अपने संदर्भ संग्रह शायद के रूप में हैं), पूर्ण पूर्वानुमान खंड बनाम जंजीर एक्सटेंशन का उपयोग एक ही चीज़ प्राप्त करता है। ऐसा इसलिए है क्योंकि IQueryable स्थगित निष्पादन की अनुमति देता है, इसलिए अनिवार्य रूप से वही एसक्यूएल दृश्यों के पीछे उत्पन्न किया जा रहा है।

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