2010-07-08 13 views

Odpowiedz

11

DataContext jest specyficzne dla LINQ do SQL, więc prawdopodobnie mówisz o kwerendach LINQ do SQL? Jeśli tak, to nie ma bezpieczny sposób to zrobić - trzeba uciekać się do hack, takich jak przy użyciu odbicia do pobrania prywatne „kontekstowe” pole pod spodem DataQuery obiektu:

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

Wspomniałeś, że to hack, ale nie powinno to być zalecane nawet jako takie. Uzyskanie dostępu do prywatnych członków poprzez refleksję nie jest dobrą praktyką i stworzy kruchy kod. Spowoduje to również ukrycie zależności między kodem wywołującym a klasą DataContext. –

+0

+1, ponieważ może to faktycznie być użyte jako "hakowanie" w celu uzyskania dostępu do kontekstu, gdy ktoś zwraca IQueryable, a następnie ma pełny dostęp do zapytania:) –

+0

Mały dodatek. System.Data.Linq.Table <> może być również interfejsem IQueryable. Kod: string typeName = q.GetType(). FullName; if (! TypeName.StartsWith ("System.Data.Linq.DataQuery'1", StringComparison.Ordinal) &&! TypeName.StartsWith ("System.Data.Linq.Table'1", StringComparison.Ordinal)) { return null; } –