码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2018-01-15 13:41:42      阅读:1530      评论:0      收藏:0      [点我收藏+]

标签:log   实现   char   语句   替换   修改   linq   添加   name   

  在使用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的解决办法

标签:log   实现   char   语句   替换   修改   linq   添加   name   

原文地址:https://www.cnblogs.com/mldcy/p/8287575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!