2013-08-13 14 views
5

इकाई फ्रेमवर्क का उपयोग करके मैं तालिका से कुछ डेटा चुनता हूं और foreach लूप के साथ इसे फिर से चलाता हूं। मैं सोच रहा हूं कि निम्नलिखित उदाहरणों में डेटा कहां से पूछताछ की जा रही है?डीबीएसईटी <TEntity> बनाम IQueryable <out T>

उदाहरण 1.

var countries = db.WorldCountries; 
foreach(var item in countries) 
{ 
    Console.WriteLine("Country: {0}", item.Country); 
} 

उदाहरण 2.

var countries = db.WorldCountries.Where(t => t.Country == "Country Name"); 
foreach(var item in countries) 
{ 
    Console.WriteLine("Country: {0}", item.Country); 
} 

पहले उदाहरण में, countriesDbSet<WorldCountries> दूसरे उदाहरण में है, countriesIQueryable<out WorldCountries> है।

उपर्युक्त उदाहरणों में .ToList() के बिना डेटा कैसे पुनर्प्राप्त किया जाता है? पूरे डेटा सेट को पुनर्प्राप्त किया गया है जब foreach लूप प्रारंभ होता है (जैसे .ToList() को पहले पुनरावृत्ति की शुरुआत में बुलाया गया था) या लूप के प्रत्येक पुनरावृत्ति पर डेटाबेस को क्वेरी जारी की जाती हैं।

धन्यवाद।

उत्तर

8

दोनों उदाहरणों में, IQueryable<WorldCountries> एसक्यूएल का संकलन किया और मार डाला बिंदु पर आप foreach दर्ज किया जाता है (जब foreach कॉल GetEnumerator)। तो आप पहले पुनरावृत्ति से पहले डीबी से परिणाम प्राप्त करते हैं, प्रत्येक एकल पुनरावृत्ति पर टुकड़े से टुकड़े नहीं होते हैं। (परिणाम डेटा रीडर के माध्यम से आते हैं इसलिए वास्तविक डेटा स्थानांतरण प्रत्येक पुनरावृत्ति के लिए टुकड़े द्वारा टुकड़ा किया जा सकता है लेकिन मेरा मतलब क्या है प्रत्येक पुनरावृत्ति पर एक अलग SQL क्वेरी नहीं है)।

ध्यान दें कि DbSet<T> भी IQueryable<WorldCountries> लागू करता है, इसलिए आपके दोनों उदाहरण समान कार्य करते हैं, सिवाय इसके कि दूसरे में कोई खंड शामिल होता है।

जब आप .ToList जोड़ते हैं, जो लौटने से पहले एक सूची को भरता है और भरता है, तो उस स्थिति में आप अगले विवरण पर जाने से पहले सभी आवश्यक डेटा डीबी से स्थानांतरित कर सकते हैं।

+0

क्या आप सुनिश्चित हैं कि डेटा हस्तांतरण टुकड़े द्वारा टुकड़ा किया जाता है, यदि ऐसा है तो क्या आपके पास कोई संदर्भ है? मैं इस –

+5

के बारे में बहुत उत्सुक हूं, मैं यह पुष्टि करने में सक्षम था कि आप सही हैं, यह वास्तव में बैच में डेटा खींचता है, सभी एक साथ नहीं। मैंने एक बड़े dbset के माध्यम से पुनरावृत्ति करके एक परीक्षण लिखा - भागने के माध्यम से मैं उस डीबी कनेक्शन को मारता हूं, और उम्मीद है कि एक त्रुटि फेंक दी गई थी। –

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