LINQ搜索法语字符

5
我正在使用EF,有一个简单的LINQ语句,想要搜索单词。因此,有文本框搜索和提交按钮。
当搜索文本包含"march"时,它可以找到例如"des marchés",但如果我搜索"marché",它就无法找到。所以这是法语字符的问题。
listAgendaItems = dc.agenda.Where(a =>
                        a.libelle_activite.Contains(searchText)
).ToList<agenda>();

这个数据库和表 Agenda 有扩展属性 -> Collation:French_CI_AS

那么我如何确保也获取到法语单词,比如 "é, à" 等等?

我还尝试搜索 "marche",但它找不到 "marchés"

1个回答

3
你的排序规则为French_CI_AS,它是“不区分大小写”,“区分重音符号”的。如果你想让一个查询“marches”匹配“marchés”,你需要使用French_CI_AI作为排序规则。在大多数语言中,这实际上不是本地人想要的,因为重音符号很重要,但这可能取决于情况或上下文。
如果实际上你的用户总是希望进行不区分重音符号的搜索,那么你应该将表(或指定字段)的排序规则属性设置为AI而不是AS。否则,如果需要很少,你可以在MS Sql中对表进行排序规则,并在每个查询中应用排序规则;请记住,如果没有对该排序规则建立索引,则可能会有相当大的性能成本。然而,在进行%通配符%查询时,这几乎可以忽略不计,因为在这种情况下,通常会进行完整的表扫描。
根据您的评论,似乎您允许在数据库中存储HTML内容。你的表中有数值字符引用,SQL Server对此一无所知,因为它们是HTML、XML和SGML的特性。只有这些字符是适当编码的字符串字面量才能使其可搜索。
NVARCHAR将以Unicode,特别是UTF-16格式存储内容,而VARCHAR将使用Windows-1252和French排序。如果您通过Web表单接受此输入,请确保页面编码是适当的。如果你只支持现代浏览器(实际上是任何IE5+版本),那么UTF-8得到了很好的支持,所以你应该考虑对所有请求和响应使用UTF-8。
请确保在您的web.config文件中,有以下配置:
<configuration>
   <system.web>
      <globalization
         requestEncoding="utf-8"
         responseEncoding="utf-8" />
   </system.web>
</configuration>

如果你的数据库中已经存储了使用数字字符引用表示的数据,你可以通过将&#ddddd;翻译成实际的UTF-16序列来取消转义,并重新存储它们。确保不要意外地取消转义语义重要的NCRs,如大于号、小于号或&符号。


我已将该特定列的排序规则从French_CI_AS更改为French_CI_AI,但仍无法找到。如果它能与“marchés”一起工作,我会很高兴,但最好是“marchés”和“marches”都可以。我需要做其他更改吗?我无法创建另一个普通的SQL语句,因为这些LINQ语句已经很复杂了。我只是在这个例子中简化了一下。所以我应该用LINQ来解决这个问题。但我可以对表或列进行任何更改... - ethem
我只是看到表格中包含这样的文本:Séminaire consacré à la gestion des marchés publics。这就是为什么它找不到的原因吗?有人提出了解决方案吗? - ethem
你的数据库中似乎有HTML代码。SQL Server并不真正了解HTML,所以它不会识别它。您需要将这些NCR存储为字符串文字。我已在上面做了一些注释。 - JasonTrue
哇...谢谢Jason...我已经按照你所描述的在我的web.config中添加了全球化标记。我只需要搜索。你能否举个例子(编码)来说明如何翻译?所以当用户输入“marchés”时,我需要将其翻译为marchés。我可以使用replace函数textbox.text.replace("é","é")...但我想你说的是另一种翻译功能。你能否给出一个编码示例...?我非常感谢你的帮助。 - ethem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接