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


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

      

  • 相关阅读:
    [HDU 1003] Max Sum
    Codeforces
    2016 年宁波工程学院第七届ACM校赛题解报告
    [DP] Light Oj 1017 Brush(III)
    GDUT-校赛-积水积木
    1031 Hungar的得分问题(二)
    HDU 1506 Largest Rectangle in a Histogram
    lightoj 1033 Generating Palindromes
    网络编程总结
    生产者消费者模型
  • 原文地址:https://www.cnblogs.com/mldcy/p/8287575.html
Copyright © 2020-2023  润新知