2013-06-06 15 views
21

.Find(id) और .Where(x = >x.Id == id) के बीच कोई महत्वपूर्ण अंतर है जो मुझे .Find().Where()/.First() पर उपयोग करने के लिए मजबूर करना चाहिए?इकाई फ्रेमवर्क बनाम बनाम

मुझे लगता है कि .Find() अधिक कुशल होगा लेकिन क्या यह इतना अधिक कुशल है कि मुझे .Where()/.First() से बचना चाहिए?

कारण मैं पूछता हूं कि मैं नकली परिणामों को लागू करना आसान बनाने के लिए अपने परीक्षणों में एक सामान्य FakeDbSet का उपयोग कर रहा हूं और अब तक मुझे पता चला है कि मुझे उस वर्ग का उत्तराधिकारी होना चाहिए और .Find() का कस्टम कार्यान्वयन प्रदान करना होगा, जबकि यदि मैं लिखूं .Where()/.First() के साथ मेरा कोड मुझे अतिरिक्त काम करने की आवश्यकता नहीं है।

+1

ठीक है, जहां आप 'कहां' संग्रह संग्रह करते हैं, वैसे ही आप 'ढूंढें' और 'सिंगलऑर्डफॉल्ट' की तुलना करना बेहतर होगा। –

+0

सच है, हालांकि मैं हमेशा उपयोग करता हूं। सबसे पहले या फर्स्टऑर्डडिफॉल्ट। –

+3

@ जिमी बॉस आप एकल के उपयोग पर विचार करना चाह सकते हैं, किसी भी परिस्थिति के लिए जहां केवल 1 रिकॉर्ड मेल खाना चाहिए। – Kyle

उत्तर

31

बिंदु यह है कि find संदर्भ के स्थानीय कैश में खोज करके शुरू होता है और फिर, यदि कोई मिलान नहीं है, तो डीबी को एक क्वेरी भेजता है।

where हमेशा डीबी को एक प्रश्न भेजता है।

ईएफ 4 * के साथ, * मुझे लगता है कि find द्वारा उत्पन्न एसक्यूएल बहुत जटिल था और, कुछ मामलों में, एक प्रदर्शन समस्या की ओर जाता है। इसलिए मैं हमेशा where का उपयोग भी एफई 5. साथ मैं एफई 5.

पत्र में

तो साथ find द्वारा उत्पन्न एसक्यूएल की जाँच करनी चाहिए, find बेहतर है क्योंकि वह कैश का उपयोग करता।

+9

+1। एक अभिव्यक्ति पेड़ पर जाने का ओवरहेड भी नहीं है, इसलिए यह डेटाबेस को हिट करता है, तो यह डेटाबेस को तेजी से हिट कर सकता है। जहां हमेशा 'अभिव्यक्तिविज्ञानी' के माध्यम से जाता है। – vcsjones

+0

कैश के कारण मुझे गलत डेटा नहीं मिल सकता है? आईई डीबी पृष्ठभूमि में अद्यतन हो जाता है? – Zapnologica

+0

हां आप कर सकते हैं। आप इसे पुनः प्राप्त करने के बाद रिकॉर्ड को अद्यतन करने, या अलगाव स्तर या ... के कारण रिकॉर्डर acces समस्या भी हो सकती है ... :) – tschmit007

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