2012-06-21 18 views
12

this प्रश्न पढ़ने के बाद, मुझे कुछ चीजों को साफ़ करने की आवश्यकता है।IENumerable <T> और IQueryable <T> स्पष्टीकरण?

IQueryable<Customer> custs = from c in db.Customers 
where c.City == "<City>" 
select c; 

IEnumerable<Customer> custs = from c in db.Customers 
where c.City == "<City>" 
select c; 

सवाल:

1) यह ठीक है कि कहने के लिए है: पहली क्वेरी में SQLServer जहां खंड सहित पूरे आपरेशन चल रहा है और केवल प्रासंगिक पंक्तियों लौटा रहा है - जबकि दूसरा एक करता है SELECT * ... और सभी पंक्तियों में सी # और THEN फ़िल्टर देता है?

2) अगर मेरे पास संग्रह संग्रह है - तो स्मृति में। (var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>" 
select c; 

बनाम

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>" 
select c; 

क्या निष्पादन में अंतर अब क्या होगा?

+0

इस प्रासंगिक विषय पर एक नज़र डालें: http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet। और, आप # 1 में अपनी धारणा में सही हैं। # 2 के बारे में 100% निश्चित नहीं है इसलिए मैं इसे दूसरे पर छोड़ दूंगा। – blizz

+0

@blizz मैं पहले से ही उस पढ़ें। सभी उत्तर एक पुस्तक पीओवी से हैं। मेरे सवाल का जवाब देने में कुछ भी नहीं ....: (... बीमार ** खुश हो ** देखने के लिए जो लाइन तो मेरे सवाल का –

उत्तर

29

1: नहीं, यह गलत

है जब से तुम केवल एक IEnumerable<Customer> में परिणाम भंडारण कर रहे हैं, लेकिन अभी भी ठीक उसी अभिव्यक्ति है कि परिणाम पैदा करता है, वे दोनों सर्वर पर निष्पादित करेंगे और केवल प्रासंगिक पंक्तियों को वापस करें।

आप इस के साथ व्यवहार में अंतर मिलेगा:

IEnumerable<Customer> custs = from c in (IEnumerable<Customer>)db.Customers 
    where c. City == "<City>" 
    select c; 

इस मामले में आप db.Customers संग्रह के लिए मजबूर कर रहे हैं IEnumerable<T>, जो जब पूरा संग्रह लायेगा प्रगणित के रूप में प्रयोग की जाने वाली।

ध्यान दें कि यह:

IEnumerable<Customer> x = from c in db.Customers 
          where c.City == "<City>" 
          select c; 

इस के समान नहीं है:

IEnumerable<Customer> x = from c in db.Customers 
          select c; 
IEnumerable<Customer> y = x.Where(c => c.City == "<City>"); 

पहले मामले में, where खंड दूसरी जीत में, एसक्यूएल का एक हिस्सा हो जाएगा 'टी। यही कारण है कि जुड़े प्रश्न/उत्तर में एक अंतर शामिल है, जबकि आपका कोड नहीं है।

यह भी ध्यान दें कि केवल आपके द्वारा लिखे गए बयान वास्तव में सर्वर पर कुछ भी निष्पादित नहीं करेंगे, क्योंकि वे प्रभावी रूप से केवल आलसी संग्रह को स्टोर करेंगे। यदि आप आगे बढ़ते हैं और उन संग्रहों का आकलन करते हैं, उस बिंदु पर प्रासंगिक बिट्स सर्वर पर निष्पादित किए जाएंगे।

2: List<T> को लागू नहीं करता है या IQueryable<T> के लिए विस्तार के तरीकों है, और न ही LINQ ऑपरेटरों शामिल होगा वापसी कुछ भी IQueryable<T>

इस मामले में के साथ संगत, पहले संकलन नहीं होंगे।

+0

answeres (मेरी कड़ी में) driis उसके जवाब में गलत है –

+0

नहीं है, जैसा कि मैंने कहा, वे? दोनों भी ऐसा ही होगा। हालांकि, लिंक किए गए कोड के मामले में, 'Where' LINQ ऑपरेटर' IEnumerable 'या' IQueryable 'करने के लिए लागू किया जाता है, तो आप को शामिल किया है एक' where' मूल प्रश्न के खंड। यह संचालन के क्रम को बदलता है, इसलिए आपके मामले में, वे उसी तरह निष्पादित करेंगे। लिंक किए गए उत्तर में, वे db.Customers संग्रह को लागू करने के लिए –

+0

IENumerable के रूप में उपयोग किए जाने के संबंध में नहीं होंगे, जो गणना किए जाने पर संपूर्ण संग्रह_, अगर मैं सही ढंग से समझ गया, तो इस कोड को सभी ग्राहक मिलेंगे और फिर फ़िल्टर? –

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