小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 路人甲Java 2021-04-03

使用EF Core 3.x+Mysql 時(shí),如下EF表達(dá)式

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

生成的語(yǔ)句:

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ù)庫(kù)函數(shù)操作,數(shù)量量大時(shí),會(huì)非常慢.
解決辦法:攔截EF生成的語(yǔ)句,將上述函數(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:注冊(cè)攔截器

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

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多