2010-10-31 12 views
13

मेरी क्वेरी में मुझे IEnumerable वापस करने की आवश्यकता है, लेकिन मुझे नहीं पता कि यह क्रिया फिर से निष्पादित करने के लिए क्वेरी करती है या नहीं?IQueryable को IEQuery से कनवर्ट करने में क्वेरी को फिर से निष्पादित करता है?

var data = Repository<Person>.Find().AsEnumerable();

Find() रिटर्न IQueryable और क्योंकि IQueryable विरासत IEnumerable। मुझे संदेह है कि AsEnumerable दोहराव निष्पादन करें।

मुझे पता है कि var data = Repository<Person>.Find().ToList() क्वेरी दो बार निष्पादित करता है। Find() के लिए एक और Tolist()

उत्तर

20

एक IQueryable के लिए दूसरा एक IEnumerable है। कोई रूपांतरण नहीं है, और इसलिए किसी भी तरह का काम नहीं चल रहा है।

काम तब होता है जब आप GetEnumerator() पर कॉल करते हैं, या तो स्पष्ट रूप से या foreach पर इसका उपयोग करके।

इसके अलावा, क्या आपने पुष्टि की है कि Repository.Find().ToList() SQL को दो बार कॉल करता है? यह मेरे लिए सही नहीं लगता है।

+0

इसे और अधिक सही बनाने के लिए। IQueryable एक IENumerable नहीं है ... लेकिन यह इसके उत्तराधिकारी है। - http://stackoverflow.com/questions/2433306/whats-the-difference-between-iqueryable-and-ienumerable – Jimmyt1988

+1

@ Jimmyt1988 https://en.wikipedia.org/wiki/Is-a#Examples_of_subtyping –

11

AsEnumerable वास्तव में आपके IQueryable पर as ऑपरेटर को लागू करने के अलावा कुछ भी नहीं करता है। तदनुसार, आपके ऑब्जेक्ट पर लागू होने वाली कोई भी भविष्य विधि System.Linq.Enumerable सिस्टम विधियों के विपरीत विस्तार विधियों का सेट करेगा। Linq.Queryable विधियों।

यह सब स्थगित निष्पादन के बारे में है। जब तक आप गणना करने की कोशिश नहीं करते हैं, तब तक आपके क्वेरी करने योग्य स्रोत (डेटाबेस संभवतः डेटाबेस) के खिलाफ कुछ भी निष्पादित नहीं होता है।

दूसरे शब्दों में:

var data=Repository.Find().AsEnumerable() 
/* The query is only actually performed AFTER here */ 
.ToList(); 

अपने कोड हैं:

var data=Repository.Find().ToList(); 

क्वेरी निष्पादित करता है दो बार, तो शायद आपने जो निश्चित रूप से करना चाहिए अपने ढूँढें() विधि में कुछ गलत कर रहे हैं, है मामला नहीं होना चाहिए।

var data = Respository.Find(); 

क्वेरी ज़ोरो बार निष्पादित करना चाहिए।

var result = data.ToList(); // THIS is what should execute the query. 
+0

आप सही थे मुझे ढूंढने के तरीके के अंत में() को सूचीबद्ध करना था और मैंने उस नोटिस को नोटिस नहीं किया था – Adrakadabra

1

लिनक के बारे में "स्ट्रीम" के रूप में सोचें और कुल कार्य "फ्लश" है। "linq से db" स्ट्रीम केवल एक बार फ्लश कर सकते हैं। .अनुक्रमिक(), .Where(), .... क्वेरी तैयार करने का एक तरीका है। टॉलिस्ट(), फर्स्ट(), मैक्स() एक कुल है लेकिन यदि आप कुल कॉल नहीं करते हैं, तो आपका linq परिणाम नहीं चलेंगे। इसकी गणना तब शुरू होती है जब इसकी गणना हो।

पूर्व

var result = users.Select(usr => usr.Name); 

कुछ भी नहीं यहाँ तक

1 कुल

result.First() 

या 2 परिणाम कहा जाता है क्या होगा

result.ToList().ForEach(...) 

yout जवाब देने के लिए गणना की जा रही है प्रश्न - .इंड(), .अनुक्रमिक() एक कुल कार्य नहीं है

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

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