2013-06-07 10 views
6

मैंने सरल IQueryable और IQueryProvider कक्षाएं लागू की हैं जो LINQ अभिव्यक्ति पेड़ पर सांख्यिकीय डेटा एकत्र करती हैं। यह हिस्सा ठीक काम करता है। इसके बाद, मैं मूल्यांकन के लिए डिफ़ॉल्ट LINQ-to-Objects प्रदाता को अभिव्यक्ति वृक्ष को पास करना चाहता हूं, क्योंकि मुझे इसे किसी भी अलग तरीके से निष्पादित करने की आवश्यकता नहीं है। शब्दों के क्रम में, मैं चाहता हूं कि मेरा प्रदाता आंकड़े को साइड-इफेक्ट के रूप में एकत्रित करें, क्वेरी को डिफ़ॉल्ट LINQ कार्यान्वयन पर पास कर दें।LINQ पासथ्रू प्रदाता?

हालांकि, मुझे डिफ़ॉल्ट प्रदाता को हैंडल प्राप्त करने में कठिनाई हो रही है। मैंने सोचा था कि मैं बस मूल IEnumerable संग्रह के लिए एक संदर्भ को बचा सकता है और उसके बाद (अपने कस्टम IQueryable से) डिफ़ॉल्ट प्रदाता वापसी की तरह:

IQueryProvider IQueryable.Provider 
{ 
    get { return _my_provider.OriginalIEnum().AsQueryable().Provider; } 
} 

लेकिन यह सही ढंग से काम नहीं करता है। कोड अंततः StackOverflowException फेंकता है। मैं सोचता हूं कि हो रहा है (डीबग मोड में सिंगल-स्टेपिंग से प्राप्त) यह है कि LINQ रनटाइम उपरोक्त विधि से प्रदाता को लाता है, फिर यह अभिव्यक्ति पेड़ को मेरे कस्टम IQueryable से प्राप्त करता है, और फिर यह नोटिस करता है कि शीर्ष-स्तर अभिव्यक्ति मेरा कस्टम IQueryable है। तो यह उचित प्रदाता को खोजने की कोशिश कर फिर से प्रक्रिया शुरू करता है। यह अंतहीन रूप से तब तक करता है जब तक एक स्टैक ओवरफ़्लो न हो।

अभी, केवल एक चीज जो मैं सोच सकता हूं वह एक अन्य आगंतुक के साथ आना है जो कस्टम IQueryable नोड्स के साथ एक और अभिव्यक्ति वृक्ष उत्पन्न करता है ताकि LINQ रनटाइम डिफ़ॉल्ट प्रदाता को कॉल कर सके। यह एक उचित काम है, क्योंकि मुझे यह सुनिश्चित करने के लिए हर पत्ते पर जाना होगा कि Call अभिव्यक्तियां हैं जो मेरे कस्टम IQueryable को दोबारा कॉल करें। क्या कोई आसान दृष्टिकोण है?

सहायता के लिए धन्यवाद।

+0

तो क्या आपके पास कुछ रिकर्सन चल रहा है जहां प्रदाता खुद को प्राप्त कर रहा है? – gunr2171

+0

बिल्कुल। जो परेशान है, क्योंकि मुझे विश्वास है कि मुझे मूल प्रदाता का संदर्भ मिलना चाहिए। –

उत्तर

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