set the ObjectContext
to MergeOption.NoTracking
(क्योंकि यह एक केवल पढ़ने के लिए आपरेशन है)। यदि आप संदर्भ से अन्य डेटा, Detach the object सहेजने के लिए उसी ObjectContext
का उपयोग कर रहे हैं।
कैसे अलग करने
foreach(IQueryable)
{
//do something
objectContext.Detach(object);
}
संपादित: आप NoTracking
विकल्प का उपयोग कर रहे हैं, तो वहाँ अलग करने
EDIT2 कोई जरूरत नहीं है: मैं इस परिदृश्य के बारे में Matt Warren को पत्र लिखा। और यहाँ प्रासंगिक निजी पत्राचार पोस्टिंग कर रहा हूँ, उसकी स्वीकृति
एसक्यूएल सर्वर से परिणाम नहीं भी सभी सर्वर द्वारा अभी तक का उत्पादन किया जा सकता है के साथ। क्वेरी सर्वर पर शुरू हो गई है और परिणाम के पहले बैच को क्लाइंट में स्थानांतरित कर दिया गया है, लेकिन अधिक उत्पादित नहीं किए जाते हैं (या वे सर्वर पर कैश किए जाते हैं) जब तक क्लाइंट उन्हें पढ़ने जारी रखने के अनुरोध नहीं होते हैं। इसे 'फ़ायरहोज कर्सर' मोड कहा जाता है, या कभी-कभी स्ट्रीमिंग के रूप में को संदर्भित किया जाता है। सर्वर उन्हें भेज रहा है के रूप में तेजी से के रूप में यह कर सकते हैं, और ग्राहक उन्हें जितनी जल्दी के रूप में यह (अपने कोड), लेकिन वहाँ है कि नीचे एक डेटा ट्रांसफर प्रोटोकॉल है भेजना जारी रखने ग्राहक से पावती की आवश्यकता कर सकते हैं पढ़ रही है अधिक डेटा IEnumerable
से
IQueryable
के बाद से इनहेरिट करती है, मेरा मानना है कि अंतर्निहित सर्वर के लिए भेजा क्वेरी ही होगा। हालांकि, जब हम IEnumerable.ToList()
करते हैं, तो डेटा रीडर, जो अंतर्निहित कनेक्शन द्वारा उपयोग किया जाता है, ऑब्जेक्ट को पॉप्युलेट करना शुरू कर देगा, ऑब्जेक्ट्स ऐप डोमेन में लोड हो जाएंगे और इन ऑब्जेक्ट्स को स्मृति से बाहर चलाया जा सकता है, इन ऑब्जेक्ट्स को अभी तक डिस्पोजेक्ट नहीं किया जा सकता है।
जब आप foreach
और IEunmerable
का उपयोग कर रहे हैं तो डेटा रीडर एक समय में SQL परिणाम सेट को पढ़ता है, ऑब्जेक्ट्स बनाए जाते हैं और फिर डिस्प्ले किए जाते हैं। अंतर्निहित कनेक्शन भाग में डेटा प्राप्त कर सकता है और जब तक सभी भाग पढ़े जाते हैं तब तक SQL सर्वर को प्रतिक्रिया नहीं भेज सकती है।
जब आपकी क्वेरी चल रहा है, आप वास्तव में अपने एसक्यूएल सर्वर "गतिविधि मॉनिटर" खोलने के लिए और क्वेरी को देख सकते हैं, के रूप में कार्य राज्य: इसलिए आप 'memory` अपवाद से बाहर
Edit3 में नहीं चलेंगे निलंबित और प्रतीक्षा प्रकार Async_network_IO
- जो वास्तव में बताता है कि परिणाम SQL सर्वर नेटवर्क बफर में है। आप इसके बारे में अधिक पढ़ सकते हैं here और here
परिणाम डिफ़ॉल्ट रूप से इन-मेमोरी संग्रह नहीं होना चाहिए - क्या आप कुछ ऐसा कर रहे हैं (ToArray, ToList, जो भी हो) इसे सभी को स्मृति में लाया जा सकता है? यदि नहीं, तो परिणामों पर केवल पुनरावृत्ति करें (foreach, चुनें, जो भी हो) और आपको ठीक होना चाहिए। –
वर्तमान में मेरी क्वेरी विधि ToList() को कॉल करती है और सूची लौटाती है लेकिन मैं इसके बजाय QueryObject को वापस करने के लिए आसानी से बदल सकता हूं। क्या आप निश्चित हैं कि यदि मैं IQueryable पर फ़ोरैच लूप करता हूं तो यह डेटा स्ट्रीम करेगा? – user169867
तो आपकी 'ToList() 'मूल रूप से' सूची