乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用IDbCommandInterceptor解決EF-CORE-3.x-使用MYSQL時,未正常的生成LIKE查詢語句

       路人甲Java 2021-04-03

      使用EF Core 3.x+Mysql 時,如下EF表達式

      var list=await ctx.Set<User>().where(v=>v.Account.Contains("test")).ToListAsync();
      

      生成的語句:

      SELECT 
          `b1`.`id`,
          `b1`.`account`,
           ...
      FROM
          `basis_user` AS `b1`
      WHERE
          LOCATE(CONVERT( 'test' USING UTF8MB4) COLLATE utf8mb4_bin,
                  `b1`.`account`) > 0
      
      

      其中 LOCATE(CONVERT( 'test' USING UTF8MB4) COLLATE utf8mb4_bin,`b1`.`account`) > 0是數(shù)據(jù)庫函數(shù)操作,數(shù)量量大時,會非常慢.
      解決辦法:攔截EF生成的語句,將上述函數(shù)操作,替換成like

      偽代碼如下:

      1:定義攔截器

      public class FmtCommandInterceptor : DbCommandInterceptor, IDbCommandInterceptor
          { 
              public static readonly Regex Regex_Replace_MySql_Like
                      = new Regex(@"LOCATE\(CONVERT\('(?<v>.+?)' USING utf8mb4\) COLLATE utf8mb4_bin, (?<k>`.+`?)\) > 0", 
                                  RegexOptions.Compiled | RegexOptions.IgnoreCase);
             public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
              {
                  command.CommandText = Regex_Replace_MySql_Like.Replace(command.CommandText, " ${k} like '%${v}%' ");
                  return base.ReaderExecuting(command, eventData, result);
              }
      
              public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = default)
              { 
                  command.CommandText = Regex_Replace_MySql_Like.Replace(command.CommandText, " ${k} like '%${v}%' ");  
                  return base.ReaderExecutingAsync(command, eventData, result, cancellationToken);
              }
          }
      

      2:注冊攔截器

                      services 
                      .AddDbContextPool<yearDbContext>(o =>
                      {
                          o.UseMySql(Configuration.GetConnectionString("youdbConfigName"), mySqlOptions =>
                          {
                              mySqlOptions.ServerVersion(new Version(5, 6, 40), ServerType.MySql);
                          }).AddInterceptors(new FmtCommandInterceptor()); 
                      })
      

      有其它場景時,也可以優(yōu)化上面的正則替換方法,達到替換執(zhí)行語句的效果

      大家如果有其它辦法處理這類問題,也麻煩分享一下

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多