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());
        }

  

posted @ 2018-01-15 12:31 梦里的畅泳 阅读(...) 评论(...) 编辑 收藏