实体框架核心中的"CONTAINS"应等同于SQL%LIKE%运算符.因此,"CONTAINS"应该不区分大小写,但是它区分大小写!(至少在Postgres?)
以下命令仅在使用正确的关键字大小写时才输出结果.
context.Counties.Where(x => x.Name.Contains(keyword)).ToList();
我做错了什么?
实体框架核心中的"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(我认为)中也是如此.
string.contains
中将转换为CHARINDEX()
,在oracle和sqlite中将其转换为instr()
,这在默认情况下是区分大小写的.EF.Functions.Like()
都会转换为SQL LIKE
表达式,该表达式默认不区分大小写,除非db或列排序规则另有定义.因此,是的,这都归结于排序规则,但是-如果我错了,请纠正我-在某种程度上,代码可能会影响区分大小写/不区分大小写的搜索,这取决于您使用上述方法中的哪一种.
现在,我可能不是完全最新的,但我认为EF核心迁移不会自然地处理数据库排序,除非您已经手动创建表,否则最终将使用默认排序(对于sqlite区分大小写,对于其他情况我不知道).
回到最初的问题,如果在future 的版本中没有3个选项,那么至少有2个选项可以执行此不区分大小写的搜索:
EF.Functions.Like()
代替string.Contains
EF.Functions.Collate()
功能中的前景看好的功能