在使用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的解决办法的更多相关文章

  1. EF 表中中多次指定了列名解决办法

    这个问题是我们实际开发中遇到过的问题. 可能的原因:数据库在执行数据表迁移的时候,数据表执行成功,最后插入EF数据迁移表__MigrationHistory的时候,没有把所有的命令行完整插入,缺失了一 ...

  2. Sql语句不能识别Go的解决办法(动态创建表的触发器)

    问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用G ...

  3. SQL Server 2008 r2 输入SQL语句不能自动提示的解决办法

    先利用“配置工具-SQL Server 配置管理器”关闭所有MSSQLSERVER服务,利用SQL Server Installation Center,进入Maintenance,选择Repair, ...

  4. 关于vs2013 mysql Ef框架中提示版本不兼容问题的解决办法

    <runtime>     <assemblyBinding>       <dependentAssembly>         <assemblyIden ...

  5. 【JMeter】if语句中不能Failure=false解决办法

    错误写法: if(roomId.matches("regEx")) Failure=false; else{ Failure=true; FailureMessage=" ...

  6. EF 解除属性映射到数据库中 NotMappedAttribute无效解决办法

    可以通过NotMappedAttribute标记模型某个属性可以使该属性不必映射到数据库. public class Unicorn { public int Id { get; set; } [No ...

  7. EF生成的SQL语句执行顺序问题。

    //实体被更改后,再做删除,EF只生成删除语句 //实体删除后再更改,EF报错 //添加语句会再,更改,删除后执行,更AddObject位置无关 //一个实体多个字段被改,只会生成一句update / ...

  8. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  9. EF中使用SQL语句或存储过程

    EF中使用SQL语句或存储过程 1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoe ...

随机推荐

  1. 函数响应式编程(FRP)思想-Callback风格

    序 ReactiveCocoa是IOS广为使用的技术框架,而ReactiveCocoa的核心思想就FRP.FRP不同于JAVA的object-oriented和AOP,FRP能让你的代码像数学一样简洁 ...

  2. python中__init__.py与def __init__(self)的使用

    一直对__init__的使用很迷茫,这里系统的学习了解下 1.__init__.py文件-package的标识 python中每个package实际上是一个目录(Directory),程序运行时如何识 ...

  3. Vue中引入jquery方法 vue-cli webpack 引入jquery

    在vue-cli 生成的工程中引入了jquery(模板用的webpack) 首先在package.json里的dependencies加入"jquery" : "^2.2 ...

  4. Softmax回归(Softmax Regression, K分类问题)

    Softmax回归:K分类问题, 2分类的logistic回归的推广.其概率表示为: 对于一般训练集:                     系统参数为:      Softmax回归与Logist ...

  5. Flex控件之repeater和radioButton应用

    代码:http://www.cnblogs.com/modou/articles/2108346.html <?xml version="1.0" encoding=&quo ...

  6. DQL-子查询

    一:含义 嵌套在其他语句内部的select语句称之为子查询或内查询 外套的语句还可以是 insert,update,delete,一般用select比较多 外面如果是select语句,我们称之为外查询 ...

  7. SQLlearn

  8. 【oracle笔记3】多表查询

    *多表查询 分类:1.合并结果集 2.连接查询 3.子查询 *合并结果集:要求被合并的表中,列的类型和列数相同. *UNION,去除重复行.完全相同的行会被去除 *UNION ALL:不去除重复行. ...

  9. c++11线程创建的三种方法

    一.用一个初始函数创建一个线程 直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了. #include & ...

  10. 分布式网上商城项目- BeanDefinitionStoreException

    BeanDefinitionStoreException: 严重: StandardWrapper.Throwable org.springframework.beans.factory.BeanDe ...