gpt4 book ai didi

sql - 如何在Linq to SQL中拦截和修改SQL查询

转载 作者:行者123 更新时间:2023-12-04 04:08:47 25 4
gpt4 key购买 nike

我想知道在发送查询之前是否有任何方法可以拦截和修改从linq生成的sql到sql?

基本上,我们有一个记录安全层,即给定类似“从记录中选择*”的查询,它将把查询修改为“从记录中选择* WHERE [somesecurityfilter]”之类的东西。

我试图找到最好的方法来拦截和修改linq to sql provider执行的sql。

最佳答案

如果要拦截由L2S生成的SQL并进行处理,那么最好的选择是为SqlConnection,SqlCommand,DbProviderFactory等创建包装类。将SqlConnection的包装实例提供给需要db连接的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...
}
}

使用时:
using (SomeDataContext dc = new SomeDataContext(new MySqlConnectionWrapper("connect strng"))
{
var q = from x in dc.SomeTable select x;
//...etc...
}

就是说,您真的要走那条路吗?您将需要能够解析L2S生成的SQL语句和查询,以便对其进行适当的修改。如果您可以改为修改linq查询以附加要添加的内容,那可能是一个更好的选择。

请记住,Linq查询是可组合的,因此,如果您要添加到许多查询中,则可以在单独的方法中添加“extras”。

关于sql - 如何在Linq to SQL中拦截和修改SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com