【问题标题】:How to write C# case insensitive LIKE statement for SQLIte using ICU extension?如何使用 ICU 扩展为 SQLite 编写 C# 不区分大小写的 LIKE 语句?
【发布时间】:2014-10-11 02:58:02
【问题描述】:

SQLite 有 limitation 将 LIKE 用于非 ASCII 符号。 ICU 分机solves 这个问题。 如何在 C# 中编写代码以创建以下不区分大小写的语句:

SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'

附:如果在 C# LIKE 语句中使用非 ASCII 符号有其他解决方案,请提供。

【问题讨论】:

    标签: c# sqlite icu


    【解决方案1】:
    var result = people.Where(x=> x.Surname.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1);
    

    【讨论】:

    • 此表达式在“people”变量中搜索不区分大小写的文本。我需要在 SQLite 数据库中搜索不区分大小写的文本。
    • 我认为,当您添加一些解释时,这对 OP 和更多访问者会更有帮助。
    【解决方案2】:

    我尝试了这种替代方法,可能会对您有所帮助:

     _database.Table<People>.Where(c => c.surname.ToUpper().Contains("Пупкин".ToUpper())  )
    

    请尝试给我们一个反馈,如果它工作或没有。

    【讨论】:

      【解决方案3】:

      C#代码

      var lst = (From p In persons
                  Where p.surname.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) >= 0
                  Select p).ToList()
      

      InvariantCultureIgnoreCaseString.IndexOf 方法的选项之一。这可能会帮助您实现 C# LIKE

      【讨论】:

      • 我记得,LINQ 已经在使用 String.Compare 时创建了不区分大小写的比较,但它们不会?
      • 是的,String.Compare 可以用作 LINQ,第三个参数 Ignorcase 有助于创建不区分大小写的比较,例如 String.Compare(p.surname, searchText, True) = 0 。这有助于找到完全匹配。以前,这是一个错字,只需编辑答案。感谢您指出
      • 我不是这个意思。但是,经过一番研究,我发现 Contains 不需要额外的参数来区分大小写。
      • 这不是如何在 C# 中对数据进行排序/比较的问题。我的主题是如何使用 LIKE 语句从 SQLite DB 中检索不区分大小写的数据?
      【解决方案4】:
      IEnumerable<Persons> p = persons.Where(x => x.surname.Contains("Пупкин"));
      

      会产生

      SELECT * FROM Persons WHERE surname LIKE '%Пупкин%'
      

      您不需要额外的参数,因为生成的 LIKE 语句已经自动不区分大小写。

      虽然IndexOf() 是个好主意,但 LINQ2SQL 不支持它。 LINQ2SQL 不支持提供CultureInfo 的任何方式,而且我不确定SQLite 服务器比较InvariantCultureOrdinal

      编辑:当你设置EntityFramework with SQLite(我建议你)。您可以像这样检索数据:

      string searchTerm = "Пупкин";
      using (MyDatabaseContext context = new MyDatabaseContext())
      {
          IEnumerable<Persons> p = context.Persons.Where(x => x.surname.Contains(searchTerm));
      }
      

      【讨论】:

      • 您提供了一个解决方案来处理已经从数据库中检索到的数据。但我问的是 SQLite 请求。
      • 最简单的方法是熟悉 EntityFramework。 Here 你可以看到如何在 SQLite 中使用它。然后,您只需在 EF 上下文对象中的 people 集合对象上使用 Where 方法。这样做时,它会产生 SQL 语句并在上下文对象所维护的连接对象上执行。
      • 能否提供一个更精确的解决方案,说明如何在 EntityFramework 中使用不区分大小写的 LIKE?
      • LIKE 在 SQL 中始终不区分大小写。当您使用 Linq2Sql 时,您可以执行 Contains() 方法,一旦您访问结果集合中的任何对象,它就会生成语句并执行它。您甚至可以放弃 EntityFramework 的想法并使用 SQLiteDbConnection 对象并执行看起来像您想要的语句的原始 SQL 语句。据我了解扩展帮助文档,它取代了一般的 LIKE,所以声明保持不变。希望我能帮上忙。
      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2022-01-03
      • 2013-09-04
      相关资源
      最近更新 更多