如何将OPTION RECOMPILE添加到Entity Framework中

Rom*_*n O 8 entity-framework

我有时会遇到参数嗅探问题.所以我想在查询结束时添加OPTION(RECOMPILE)来修复它.我怎么能在EF 6中做到这一点?

Rom*_*n O 11

我实现了IDbCommandInterceptor接口来修复参数嗅探错误.

新拦截器的用法:

  using (var dataContext = new AdventureWorks2012Entities())
  {
    var optionRecompileInterceptor = new OptionRecompileInterceptor();
    DbInterception.Add(optionRecompileInterceptor);

    string city = "Seattle";
    var seattle = (
      from a in dataContext.Addresses
      where a.City == city
      select a).ToList();

    DbInterception.Remove(optionRecompileInterceptor); //Remove interceptor to not affect other queries
  }
Run Code Online (Sandbox Code Playgroud)

拦截器的实施:

public class OptionRecompileInterceptor : DbCommandInterceptor
{
  static void AddOptionToCommand(DbCommand command)
  {
    string optionRecompileString = "\r\nOPTION (RECOMPILE)";
    if (!command.CommandText.Contains(optionRecompileString)) //Check the option is not added already
    {
      command.CommandText += optionRecompileString;
    }
  }


  public override void NonQueryExecuting(
    DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
  {
    AddOptionToCommand(command);
  }

  public override void ReaderExecuting(
    DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
  {
    AddOptionToCommand(command);
  }

  public override void ScalarExecuting(
    DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
  {
    AddOptionToCommand(command);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是如果您继承`DbCommandInterceptor` 类会更容易,因此您不必覆盖不需要的方法。 (2认同)