我有一个我怀疑是参数嗅探的查询。我想应用像here那样的拦截器,但我不希望任何其他查询受到影响。
那里使用的代码是:DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
此命令的范围是什么,如何将拦截器的范围限制为单个查询?
我的第一个想法是做这样的事情:
var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
DbInterception.Add(interceptor);
// Do query
}
finally
{
DbInterception.Remove(interceptor);
}
但这样做是否相同或者是否会影响其他线程上的查询?
更新
另一个想法发生在我身上。如果我无法控制何时应用拦截器,是否有办法将逻辑放入拦截器中的条件if
语句中,然后为拦截器提供某种上下文,以便它知道何时应用拦截器?
答案 0 :(得分:2)
我可以为此考虑两个选项,因为它处于全局级别,在你想要挑出的查询中,你可以做一些你说9 = 9或者总是正确的事情所以你知道它是你想要的查询。然后你可以找到并用空字符串替换where子句部分,然后继续你将要做的任何事情。
另一个相当狡猾,但应该工作。在你的拦截器代码中,你可以这样做:
var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;
但是你应该能够将它转换为你特定的DbContext类型。在该DbContext类型上,您可以添加一些布尔属性,以指示这是您正在运行的查询。然后,在运行它之前,您可以将其设置为true,并且您可以拦截它。