1. 程式人生 > >EF SQLite的Like語句,生成為CHARINDEX的解決辦法

EF SQLite的Like語句,生成為CHARINDEX的解決辦法

ndt bpa sta like body 支持 正則 bre 發現

  在使用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的解決辦法