首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本搜索,如SQL、COLLATE、Latin1_General_CI_AI和LINQ。

文本搜索,如SQL、COLLATE、Latin1_General_CI_AI和LINQ。
EN

Stack Overflow用户
提问于 2018-11-29 18:43:23
回答 2查看 1.8K关注 0票数 0

我可以通过SQL搜索customers表,没有任何问题。

代码语言:javascript
运行
复制
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的方法?

EN

回答 2

Stack Overflow用户

发布于 2018-11-29 20:25:09

我发现唯一使用排序规则的地方是Entity SQL的ORDER BY子句。

您可以使用如下所示的SqlQuery来使用使用COLLATE子句的here字符串(当然带有参数):

代码语言:javascript
运行
复制
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索引,并对特定单词进行全文搜索查询,例如:

代码语言:javascript
运行
复制
SELECT Name from Customers WHERE CONTAINS(Name ,@thatName)

更新

另一种选择是使用拦截器来更改由子句生成的SQL,如此SO question所示。该拦截器使用正则表达式将LIKE替换为CONTAINS。可以使用更简单的表达式在LIKE之前插入COLLATE子句

代码不是微不足道的,但至少它是一个选择。

票数 2
EN

Stack Overflow用户

发布于 2018-11-29 20:11:29

为什么不对Unicode值使用下面的filer子句

转换归类类型将导致性能问题并阻止索引的使用

代码语言:javascript
运行
复制
select Name
from Customers
where Name like N'%özgür%'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53537158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档