我可以通过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子句
代码不是微不足道的,但至少它是一个选择。
https://stackoverflow.com/questions/53537158
复制相似问题