我可以通过SQL搜索customers表,没有任何问题。
select Name
from Customers
where Name COLLATE Latin1_General_CI_AI like '%ozgur%'
此查询可以找到"özgür“
当我将这个表放到缓存中并尝试使用linq搜索这个表时,我无法通过"ozgur“搜索词找到"özgür”。
在C# LINQ中有没有类似的使用Latin1_General_CI_AI的方法?
发布于 2018-11-29 20:25:09
我发现唯一使用排序规则的地方是Entity SQL的ORDER BY子句。
您可以使用如下所示的SqlQuery来使用使用COLLATE子句的here字符串(当然带有参数):
var query = "select Name from Customers " +
" where Name COLLATE Turkish_CI_AI like @name";
var results = myContext.Customers
.SqlQuery(query,new SqlParameter("@name","%ozgur%"))
.ToList();
不过,我还是建议大家谨慎行事。LIKE '%...%'
不能从覆盖name
字段的任何索引中获益,因此必须搜索整个表。即使是Name = @name COLLATE ...
也可能不使用任何索引,因为排序规则与构建索引时使用的排序规则不匹配。
您应该考虑使用full text search索引,并对特定单词进行全文搜索查询,例如:
SELECT Name from Customers WHERE CONTAINS(Name ,@thatName)
更新
另一种选择是使用拦截器来更改由子句生成的SQL,如此SO question所示。该拦截器使用正则表达式将LIKE
替换为CONTAINS
。可以使用更简单的表达式在LIKE
之前插入COLLATE
子句
代码不是微不足道的,但至少它是一个选择。
发布于 2018-11-29 20:11:29
为什么不对Unicode值使用下面的filer子句
转换归类类型将导致性能问题并阻止索引的使用
select Name
from Customers
where Name like N'%özgür%'
https://stackoverflow.com/questions/53537158
复制相似问题