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