2010-04-30 6 views
7

यदि मेरे पास ऐसी वस्तु है जो आलसी बहुत बड़ी वस्तुओं के साथ एक एसोसिएशन लोड करती है, तो क्या आलसी लोड होने पर मैं प्रोसेसिंग कर सकता हूं? मैंने सोचा कि मैं DataLoadOptions से एसोसिएटविथ या लोडविथ का उपयोग कर सकता हूं, लेकिन उन पर आप क्या कर सकते हैं, इस पर बहुत ही विशिष्ट प्रतिबंध हैं। असल में मुझे सूचित किया जाना चाहिए जब एक EntitySet <> संबंधित ऑब्जेक्ट को लोड करने का समय तय करता है, इसलिए मैं उस ईवेंट को पकड़ सकता हूं और लोड ऑब्जेक्ट पर कुछ प्रोसेसिंग कर सकता हूं। जब मैं पैरेंट ऑब्जेक्ट लोड करता हूं, तो मैं केवल एंटीटीसेट से नहीं चलना चाहता, क्योंकि इससे सभी आलसी लोड किए गए आइटम लोड हो जाएंगे (आलसी लोडिंग के उद्देश्य को हराकर)।LINQ से SQL: आलसी लोडेड एसोसिएशन के लोड प्रोसेसिंग पर

+0

आप EntitySet शब्द का उपयोग करते हैं <> जहां LINQ से SQL तालिका <> का उपयोग करता है। क्या आप इसके बजाय एंटीटी फ्रेमवर्क का उपयोग कर रहे हैं? यदि ऐसा है तो मुझे विश्वास है कि मेरा जवाब है। –

उत्तर

2

ListChanged घटना

EntitySet < टी > की सदस्यता लें एक घटना ListChanged कहा जाता है जो आप अगर एक आइटम जोड़ा जा रहा है पता लगाने के लिए उपयोग कर सकते हैं उजागर करता है। ListChangedEventArgs की ListChangedType संपत्ति का मूल्यांकन करें। ListChangedType enum में उपलब्ध मानों का एक लिंक यहां दिया गया है।

जब तक आप गणनाकर्ता से अनुरोध करने से बचें तब तक लोड निष्पादित करने के लिए मजबूर करने का कोई खतरा नहीं है।

http://msdn.microsoft.com/en-us/library/system.componentmodel.listchangedtype.aspx

+0

काम नहीं करेगा, EntitySet पर लोड() फ़ंक्शन, जो IENumerable (= आलसी) स्रोत का आकलन करेगा, कोई सूचीChangedEvents नहीं बढ़ाता है। –

+0

लोड होने पर यह एक आंतरिक सूची पॉप्युलेट करना चाहिए। मुझे आश्चर्य है कि नवीनतम आरएक्स (प्रतिक्रियाशील एक्सटेंशन) लोडिंग का पता लगाने में मदद कर सकता है। Http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx देखें। – randolphcabral

+0

यह वास्तव में एक आंतरिक सूची को पॉप्युलेट करता है, जो किसी भी सूची बदलें नोटिफिकेशन नहीं बढ़ाता है। –

1

मुझे इस उपलब्ध के लिए कोई विस्तारशीलता बिंदु नहीं दिखाई देता है; केवल एक चीज जो मैं देख सकता हूं वह एफके इकाई में है, प्रत्येक व्यक्तिगत ऑब्जेक्ट पर एक निर्मित विधि है जिसे निर्माता से निकाल दिया जाता है ...

तो कन्स्ट्रक्टर कॉल बनाया गया है, और व्यक्तिगत रूप से, मुझे 100% यकीन नहीं है कि इकाई सेट लोडिंग उस समय प्रत्येक व्यक्तिगत वस्तु बनाता है, और घटना को आग लगती है ...

एचटीएच।

+1

ठीक है, जिसने सीधे मदद नहीं की, लेकिन इससे मुझे याद दिलाया गया कि PLINQO में एक ऑनलोडेड विधि है जिसका मैं उपयोग कर सकता हूं। अभी भी सही नहीं है, लेकिन यह मुझे मेरी वर्तमान समस्या से पहले मिल सकता है। –

1

LINQ2SQL द्वारा उत्पन्न डेटाकॉन्टेक्स्ट और डेटा कक्षाओं में विस्तारशीलता विधियों में निर्मित का एक गुच्छा है।

http://msdn.microsoft.com/en-us/library/bb882671.aspx

http://csainty.blogspot.com/2008/01/linq-to-sql-extending-data-classes.html

इनमें से किसी उद्देश्य की जरूरत की सेवा करने में सक्षम हो सकता है।

0

आप निश्चित रूप से डिफ़ॉल्ट EntitySet<> का उपयोग करने के लिए बाध्य नहीं कर रहे हैं, लेकिन इसके बजाय किसी भी IList <> संग्रह का उपयोग कर सकते हैं। मैंने EntitySet <> पर थोड़ा प्रतिबिंब किया है लेकिन लोड() विधि में कोई हुक नहीं मिला है, जो इकाई सेट के आलसी स्रोत को समझाता है (यह वह जगह है जहां एंटीटीसेट वास्तव में पूछताछ और भौतिक हो जाता है)।

लिंक से एसक्यूएल आपके संग्रह में एक आईनेमरेबल स्रोत (जो डिफ़ॉल्ट रूप से आलसी है) असाइन करने के लिए असाइन() विधि का उपयोग करेगा। वहां से शुरू करने से, आप उस बिंदु पर कस्टम हुक के साथ अपनी आलसी लोडिंग एंटिटीसेट को कार्यान्वित कर सकते हैं, जिसे आप पहले स्रोत संग्रह (क्वेरी निष्पादित करें) की गणना करते हैं।