Если вы хотите перехватить SQL, сгенерированный L2S, и поиграться с ним, лучше всего создать классы-обертки для SqlConnection, SqlCommand, DbProviderFactory и т. Д. Дать упакованный экземпляр SqlConnection перегрузке конструктора LatS-Datacontext, которая принимает соединение дб. В подключенном соединении вы можете заменить DbProviderFactory своим собственным классом, производным от DbProviderFactory, который возвращает упакованные версии SqlCommand и т. Д.
например:.
//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 являются составными, поэтому вы можете добавлять «дополнительные» в отдельный метод, если у вас есть что-то, что вы хотите добавить ко многим запросам.