实体框架核心中的"CONTAINS"应等同于SQL%LIKE%运算符.因此,"CONTAINS"应该不区分大小写,但是它区分大小写!(至少在Postgres?)

以下命令仅在使用正确的关键字大小写时才输出结果.

context.Counties.Where(x => x.Name.Contains(keyword)).ToList();

我做错了什么?

推荐答案

以前EF核心的老版本就是这种情况.现在string.Contains区分大小写,例如sqlite,它映射到sqlite函数‘instr()’(对于PostgreSQL我不知道).

如果您想以不区分大小写的方式比较字符串,可以使用DbFunctions来完成工作.

context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();

更新至@Gert:

问题中的部分假设是不正确的.string.Contains不会转换为LIKE expression,即使在ef核心版本<;=1.0(我认为)中也是如此.

  • 除非另外定义了数据库或列排序规则(同样,对于PostgreSQL,我也不知道),否则在SQLServerstring.contains中将转换为CHARINDEX(),在oraclesqlite中将其转换为instr(),这在默认情况下是区分大小写的.
  • 在所有情况下,EF.Functions.Like()都会转换为SQL LIKE表达式,该表达式默认不区分大小写,除非db或列排序规则另有定义.

因此,是的,这都归结于排序规则,但是-如果我错了,请纠正我-在某种程度上,代码可能会影响区分大小写/不区分大小写的搜索,这取决于您使用上述方法中的哪一种.

现在,我可能不是完全最新的,但我认为EF核心迁移不会自然地处理数据库排序,除非您已经手动创建表,否则最终将使用默认排序(对于sqlite区分大小写,对于其他情况我不知道).

回到最初的问题,如果在future 的版本中没有3个选项,那么至少有2个选项可以执行此不区分大小写的搜索:

  1. 使用此trick指定使用DbContext.OnModelCreating()创建时的列排序规则
  2. EF.Functions.Like()代替string.Contains
  3. 或者等待仍在discussion:EF.Functions.Collate()功能中的前景看好的功能

Database相关问答推荐

Power BI中的计数

如何从大型Oracle数据库中删除列?

包含接受Cassandra中多个数据的语句

有关托管默认 SQL Server 实例的 Azure VM 数据库服务器的问题

即使将enable_seqscan设置为关闭,也未使用数组列上的 GIN 索引?

动态数据模型

使用自动递增主键将 csv 导入 sqlite

Postgresql:优化数字字段的列大小

如何将新架构添加到现有的 Visual Studio 数据库项目?

为什么数据库索引使用平衡树,而不是哈希表?

如何在 MSSQL 2005 中创建递归查询?

我可以在没有数据源的情况下配置 Grails 吗?

无法加载时区?

SQL Server 自动备份

Rails 新手,设置 db 然后运行 ​​rake db:create/migrate

Android - ViewHolder 模式是否在 CursorAdapter 中自动实现?

有哪些不同类型的索引,每种索引的好处是什么?

复制没有 LOCK 权限的 postgres 数据库

如何在数据库中表示树状 struct

Chrome 将其 SQLite 数据库保存到哪里?