मान लें कि हमारे पास इस तरह एक विधि है:
सार्वजनिक IEnumerable & lt; T & gt; प्रथम पद्धति () {var संस्थाओं = संदर्भ से टी। उत्पाद जहां {कुछ स्थितियों} का चयन करें; विदेशी (संस्थाओं में विभिन्न संस्था) {entity.SomeProperty = {SomeValue}; उपज रिटर्न इकाई; }}
जहां संदर्भ एक डेटा कॉन्टेक्ट है जो कि Linq से एसक्यूएल डिजाइनर द्वारा उत्पन्न होता है।
क्या "प्रथमप्रस्था" डेटा को मेमोरी में डाटाबेस से लोड करता है (विदेशी मुद्रा की वजह से) लूप) या क्या यह अभी भी स्थगित करेगा- जब तक कि अन्य उपन्यास लूप में "उपज रिटर्न" नहीं होता है, जैसा कि निम्नलिखित पद्धति में पाया जाता है?
सार्वजनिक शून्य द्वितीय विधि () (foreach () प्रथम मद में वर्गा आइटम ()) {{कुछ कुछ}}}
उत्तरार्द्ध ( स्थगित); प्रथम विधि
एक इटरेटर ब्लॉक है ( उपज रिटर्न के कारण
); इसका मतलब है कि आपके पास इटरेटर की एक श्रृंखला है जब तक अंतिम कॉलर डेटा को फिर से शुरू नहीं करता है, तब तक कुछ नहीं पढ़ा जाता है; फिर अंतिम कॉलर foreach
(जिसके बीच कनेक्शन / कमांड खुला है) के दौरान प्रत्येक रिकॉर्ड को बदले में पढ़ा जाता है।
का उपयोग करके < / Code> जो चारों ओर
foreach
(बोनट के नीचे) यह सुनिश्चित करता है कि यदि foreach
को आधे रास्ते के माध्यम से त्याग दिया जाता है तो कनेक्शन बंद हो जाता है।
यदि डेटा को पहले लोड करने के लिए चाहें , .toList ()
या .oArray ()
को स्थानीय रूप से बफर करने के लिए उपयोग करें - लेकिन ध्यान दें कि यह ब्रेक "रचना" - अर्थात कॉलर अब अतिरिक्त जहां
आदि खंड (जो वे कर सकते हैं यदि यह एक कच्चा IQueryable & lt; T & gt;
देता है) जोड़ नहीं सकते।
अपना प्रश्न दोबारा:
सार्वजनिक IEnumerable & lt; T & gt; प्रथम पद्धति () {var संस्थाओं = संदर्भ से टी। उत्पाद जहां {कुछ स्थितियों} का चयन करें; Foreach (संस्थाओं में विभिन्न संस्थाएं। अतुलनीय ()) {entity.SomeProperty = {SomeValue}; उपज रिटर्न इकाई; }}
asenumerable
यहां की कुंजी है; यह कम्पोज़ योग्य IQueryable & lt; T & gt;
श्रृंखला समाप्त करता है, और बाकी के लिए LINQ-to-Objects का उपयोग करता है।
Comments
Post a Comment