EF SQLite的Like语句,生成为CHARINDEX的解决办法

Posted 梦里的畅泳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF SQLite的Like语句,生成为CHARINDEX的解决办法相关的知识,希望对你有一定的参考价值。

  在使用EF SQLite的时候发现Like语句不能完全查询出来,看了下生成的SQL语句类似于这种 

(CHARINDEX(@p__linq__2, [Extent1].[LeagueName])) > 0)

  查了下资料,在SQLite中是不支持CHARINDEX这个函数的,其实解决办法很简单,我们只要自己实现个Interceptor,再替换一下SQL语句,然后添加到EF中就可以了,下面是Interceptor的实现:

private static Regex replaceRegex = new Regex(@"\(\(CHARINDEX\((.*?), (.*?)\)\) > 0\)");
private void ReplaceCharIndexFunc(DbCommand command)
        {
            var flag = false;
            var text = replaceRegex.Replace(command.CommandText, m =>
            {
                if (!m.Success) return m.Value;
                flag = true;
                var key = m.Groups[1].Value;
                var name = m.Groups[2].Value;
                //替换参数
                foreach (DbParameter commandParameter in command.Parameters)
                {
                    if (commandParameter.ParameterName == key.Substring(1))
                    {
                        commandParameter.Value = $"%{commandParameter.Value}%";
                        break;
                    }
                }
                return $"{name} LIKE {key}";
            });
            if (flag)
                command.CommandText = text;
        }

  首先是正则替换掉所有的CHARINDEX,然后是修改查询的值。然后我们在EF中把Interceptor添加上去:

public QiuTanDb() : base("name=defaultConn")
        {
            DbInterception.Add(new SqliteInterceptor());
        }

  

以上是关于EF SQLite的Like语句,生成为CHARINDEX的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

SQLite的LIKE语句实现字符片段筛选的功能

SQLite的LIKE语句实现字符片段筛选的功能

SQLite的LIKE语句实现字符片段筛选的功能

数据存储——SQLite数据库存储——SQL语句——DQL数据查询语言

dotnet-ef dbcontext 脚手架在与 SQLite 一起使用时生成 HasColumnType 包括长度与 HasMaxLength

为啥 EF Core 2.0 会生成多个重复的 SQL 语句?