¿Es posible acceder al objeto DataContext detrás de un IQueryable?Acceso a DataContext detrás de IQueryable
Si es así, ¿cómo?
¿Es posible acceder al objeto DataContext detrás de un IQueryable?Acceso a DataContext detrás de IQueryable
Si es así, ¿cómo?
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;
}
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. –
+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:) –
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; } –
éxito, se reúnen en boxes. – Will