Czy możliwy jest dostęp do obiektu DataContext za IQueryable?Access DataContext behind IQueryable
Jeśli tak, w jaki sposób?
Czy możliwy jest dostęp do obiektu DataContext za IQueryable?Access DataContext behind IQueryable
Jeśli tak, w jaki sposób?
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;
}
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. –
+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:) –
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; } –
Sukces, spotkać pit. – Will