mrw*_*yne 9 sql linq linq-to-sql
我想知道在查询被发送之前是否有任何方法可以拦截和修改从linq生成的sql到Sql?
基本上,我们有一个记录安全层,给出一个像'select*from records'这样的查询,它会将查询修改为'select*from records WHERE [somesecurityfilter]'
我试图在linq到sql提供程序执行之前找到拦截和修改sql的最佳方法.
如果您想拦截 L2S 生成的 SQL 并进行修改,最好的选择是为 SqlConnection、SqlCommand、DbProviderFactory 等创建一个包装类。将 SqlConnection 的包装实例提供给采用数据库连接的 L2S 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...
}
}
Run Code Online (Sandbox Code Playgroud)
使用时:
using (SomeDataContext dc = new SomeDataContext(new MySqlConnectionWrapper("connect strng"))
{
var q = from x in dc.SomeTable select x;
//...etc...
}
Run Code Online (Sandbox Code Playgroud)
也就是说,你真的想走那条路吗?您需要能够解析 L2S 生成的 SQL 语句和查询,以便正确修改它们。如果您可以修改 linq 查询以附加您想要添加到其中的任何内容,那么这可能是一个更好的选择。
请记住,Linq 查询是可组合的,因此如果您想要将某些内容添加到多个查询中,则可以在单独的方法中添加“额外内容”。