如何将拦截器添加到 Entity Framework 中的单个查询?
How can I add an interceptor to a single query in Entity Framework?
我怀疑有一个查询存在参数嗅探问题。我想像 here 那样应用一个拦截器,但我不希望任何其他查询受到影响。
那里使用的代码是:DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
此命令的作用域是什么?如何将拦截器的作用域限制为单个查询?
我的第一个想法是做这样的事情:
var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
DbInterception.Add(interceptor);
// Do query
}
finally
{
DbInterception.Remove(interceptor);
}
但是这样做是否相同,或者它会影响其他线程上的查询吗?
更新
我想到了另一个想法。如果我无法控制何时应用拦截器,有没有办法将逻辑放在拦截器的条件 if
语句中,然后向拦截器提供某种上下文,以便它知道何时应用逻辑?
我能想到的两个选项,因为它是全局级别的,在你想挑出的查询中,你可以做一些你说 9 = 9 或总是正确的事情,所以你知道这是你想要的查询。然后你可以找到并用一个空字符串替换 where 子句部分,然后继续你要做的任何事情。
另一个有点偷偷摸摸,但应该可以。在您的拦截器代码中,您可以这样做:
var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;
但是您应该能够将其转换为特定的 DbContext 类型。在该 DbContext 类型上,您可以只添加一些布尔值 属性 来指示这是您的查询 运行。然后,就在 运行 它之前,您可以在其他任何地方将其设置为 true 并且您可以拦截它。
我怀疑有一个查询存在参数嗅探问题。我想像 here 那样应用一个拦截器,但我不希望任何其他查询受到影响。
那里使用的代码是:DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());
此命令的作用域是什么?如何将拦截器的作用域限制为单个查询?
我的第一个想法是做这样的事情:
var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
DbInterception.Add(interceptor);
// Do query
}
finally
{
DbInterception.Remove(interceptor);
}
但是这样做是否相同,或者它会影响其他线程上的查询吗?
更新
我想到了另一个想法。如果我无法控制何时应用拦截器,有没有办法将逻辑放在拦截器的条件 if
语句中,然后向拦截器提供某种上下文,以便它知道何时应用逻辑?
我能想到的两个选项,因为它是全局级别的,在你想挑出的查询中,你可以做一些你说 9 = 9 或总是正确的事情,所以你知道这是你想要的查询。然后你可以找到并用一个空字符串替换 where 子句部分,然后继续你要做的任何事情。
另一个有点偷偷摸摸,但应该可以。在您的拦截器代码中,您可以这样做:
var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;
但是您应该能够将其转换为特定的 DbContext 类型。在该 DbContext 类型上,您可以只添加一些布尔值 属性 来指示这是您的查询 运行。然后,就在 运行 它之前,您可以在其他任何地方将其设置为 true 并且您可以拦截它。