2010-07-08 12 views
10

के पीछे डेटा कॉन्टेक्स्ट एक्सेस करें IQueryable के पीछे DataContext ऑब्जेक्ट तक पहुंच बनाना संभव है?IQueryable

यदि हां, तो कैसे?

+0

सफलता, गड्ढे मिलते हैं। – Will

उत्तर

11

डेटाकॉन्टेक्स्ट LINQ से SQL के लिए विशिष्ट है, तो संभवतः आप LINQ से SQL क्वेरी के बारे में बात कर रहे हैं? यदि हां, तो वहाँ यह करने के लिए कोई सुरक्षित तरीका है - आप इस तरह के प्रतिबिंब का उपयोग अंतर्निहित DataQuery वस्तु के निजी "संदर्भ" क्षेत्र को पुनः प्राप्त करने के रूप में एक हैक का सहारा लेना है:

static DataContext GetContext (IQueryable q) 
{ 
    if (!q.GetType().FullName.StartsWith ("System.Data.Linq.DataQuery`1")) return null; 
    var field = q.GetType().GetField ("context", BindingFlags.NonPublic | BindingFlags.Instance); 
    if (field == null) return null; 
    return field.GetValue (q) as DataContext; 
} 
+1

आपने बताया कि यह एक हैक है, लेकिन इसकी सिफारिश भी नहीं की जानी चाहिए। प्रतिबिंब के माध्यम से निजी सदस्यों तक पहुंच एक अच्छा अभ्यास नहीं है, और यह भंगुर कोड का उत्पादन करेगा। ऐसा करने से कॉलिंग कोड और डेटाकॉन्टेक्स्ट क्लास के बीच निर्भरता भी छिप जाती है। –

+0

+1 क्योंकि जब कोई व्यक्ति IQueryable देता है तो उसके संदर्भ में पहुंचने के लिए वास्तव में 'हैक के रूप में' उपयोग किया जा सकता है और उसके बाद क्वेरी तक पूर्ण पहुंच है:) –

+0

एक छोटा सा अतिरिक्त। System.Data.Linq.Table <> IQueryable इंटरफ़ेस भी व्यवहार कर सकता है। कोड: स्ट्रिंग प्रकारनाम = q.GetType()। पूर्ण नाम; if (! TypeName.StartsWith ("System.Data.Linq.DataQuery'1", StringComparison.Ordinal) &&! TypeName.StartsWith ("System.Data.Linq.Table'1", StringComparison.Ordinal)) { वापसी शून्य; } –

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