EF SQLite的Like語句,生成為CHARINDEX的解決辦法
阿新 • • 發佈:2018-01-15
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的解決辦法