如何在实体框架中为单个查询添加拦截器?

时间:2017-03-27 16:28:07

标签: entity-framework entity-framework-6 interceptor

我有一个我怀疑是参数嗅探的查询。我想应用像here那样的拦截器,但我不希望任何其他查询受到影响。

那里使用的代码是:DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

此命令的范围是什么,如何将拦截器的范围限制为单个查询?

我的第一个想法是做这样的事情:

var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
    DbInterception.Add(interceptor);

    // Do query
}
finally
{
    DbInterception.Remove(interceptor);
}

但这样做是否相同或者是否会影响其他线程上的查询?

更新 另一个想法发生在我身上。如果我无法控制何时应用拦截器,是否有办法将逻辑放入拦截器中的条件if语句中,然后为拦截器提供某种上下文,以便它知道何时应用拦截器?

1 个答案:

答案 0 :(得分:2)

我可以为此考虑两个选项,因为它处于全局级别,在你想要挑出的查询中,你可以做一些你说9 = 9或者总是正确的事情所以你知道它是你想要的查询。然后你可以找到并用空字符串替换where子句部分,然后继续你将要做的任何事情。

另一个相当狡猾,但应该工作。在你的拦截器代码中,你可以这样做:

var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;

但是你应该能够将它转换为你特定的DbContext类型。在该DbContext类型上,您可以添加一些布尔属性,以指示这是您正在运行的查询。然后,在运行它之前,您可以将其设置为true,并且您可以拦截它。