Si desea interceptar el SQL generado por L2S y manipularlo, su mejor opción es crear clases de contenedor para SqlConnection, SqlCommand, DbProviderFactory etc. Proporcione una instancia envuelta de SqlConnection a la sobrecarga del constructor de contexto de datos L2S que tome una conexión db. En la conexión completa, puede reemplazar el DbProviderFactory con su propia clase derivada de DbProviderFactory personalizada que devuelve versiones empaquetadas de SqlCommand, etc.
P. ej.:
//sample wrapped SqlConnection:
public class MySqlConnectionWrapper : SqlConnection
{
private SqlConnecction _sqlConn = null;
public MySqlConnectionWrapper(string connectString)
{
_sqlConn = new SqlConnection(connectString);
}
public override void Open()
{
_sqlConn.Open();
}
//TODO: override everything else and pass on to _sqlConn...
protected override DbProviderFactory DbProviderFactory
{
//todo: return wrapped provider factory...
}
}
En el uso:
using (SomeDataContext dc = new SomeDataContext(new MySqlConnectionWrapper("connect strng"))
{
var q = from x in dc.SomeTable select x;
//...etc...
}
Dicho esto, es lo que realmente desea ir por ese camino? Tendrá que ser capaz de analizar las declaraciones SQL y las consultas generadas por L2S para modificarlas adecuadamente. Si puede modificar las consultas de linq para agregar lo que quiera agregar a ellas, esa es probablemente una mejor alternativa.
Recuerde que las consultas de Linq son compostables, por lo que puede agregar "extras" en un método diferente si tiene algo que desea agregar a muchas consultas.
¿Hay alguna razón específica por la que el filtro deba implementarse en el punto en que Linq genera el SQL SQL? Posiblemente sería más sencillo si los filtros: a) se implementaron a través de vistas en su base de datos ob) modelando su modelo de objetos de seguridad en su aplicación e implementando los filtros en el punto en que define sus expresiones de consulta de linq. –