Если вы хотите перехватить SQL, сгенерированный L2S, и с этим поиграть, лучше всего создать классы-оболочки для SqlConnection, SqlCommand, DbProviderFactory и т. Д. Дайте обернутый экземпляр SqlConnection для перегрузки конструктора L2S datacontext, который принимает соединение db. В завернутом соединении вы можете заменить DbProviderFactory своим собственным производным DbProviderFactory классом, который возвращает завернутые версии SqlCommand и т. Д.
E.g.:
//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...
}
}
При использовании:
using (SomeDataContext dc = new SomeDataContext(new MySqlConnectionWrapper("connect strng"))
{
var q = from x in dc.SomeTable select x;
//...etc...
}
Это говорит, вы действительно хотите идти по этому пути? Вы должны будете иметь возможность анализировать SQL-запросы и запросы, созданные L2S, чтобы правильно их редактировать. Если вы можете изменить запросы linq, чтобы добавить все, что вы хотите добавить к ним, это, вероятно, лучшая альтернатива.
Помните, что запросы Linq являются составными, поэтому вы можете добавлять «дополнительные» в отдельный метод, если у вас есть что-то, что вы хотите добавить ко многим запросам.
Есть ли какая-то конкретная причина, по которой фильтр должен быть реализован в точке Linq to SQL, генерирует SQL? Возможно, было бы проще, если бы фильтры были либо: а) реализованы через представления в вашей БД или б) путем моделирования модели объекта безопасности в вашем приложении и реализации фильтров в точке, где вы определяете выражения выражения linq? –