2010-07-08 13 views

Respuesta

11

DataContext es específico para LINQ to SQL, ¿así que presumiblemente está hablando de consultas de LINQ a SQL? Si es así, no hay manera segura de hacer esto - usted tiene que recurrir a un truco como el uso de la reflexión para recuperar el campo privado "contexto" del subyacente DataQuery objeto:

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

Mencionaste que esto es un truco, pero no debería ser recomendado incluso como tal. Acceder a miembros privados a través de la reflexión no es una buena práctica, y producirá un código quebradizo. Hacerlo también oculta la dependencia entre el código de llamada y la clase DataContext. –

+0

+1, ya que esto se puede utilizar realmente como 'hackeo' para acceder al contexto cuando alguien devuelve IQueryable y luego tiene acceso completo a la consulta de distancia:) –

+0

Una pequeña adición. System.Data.Linq.Table <> también puede estar detrás de la interfaz IQueryable. Código: 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; } –

Cuestiones relacionadas