linq搜索法语字符

时间:2010-11-30 19:09:59

标签: c# linq-to-entities globalization collation

我是usint EF,有一个简单的LINQ语句,想要搜索单词。 所以有文本框搜索和提交按钮。

当searchtext包含"march"时,它会找到例如。 "des marchés",但如果我搜索"marché",则无法找到。所以这是法国人的角色。

listAgendaItems = dc.agenda.Where(a =>
                        a.libelle_activite.Contains(searchText)
).ToList<agenda>();

数据库和表Agenda具有扩展属性 - &gt;整理:French_CI_AS

那么我怎样才能确保得到法语单词?比如“é,à”等

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

1 个答案:

答案 0 :(得分:3)

您的排序规则French_CI_AS是“Case-Insensitive”,“Accent-Sensitive”。如果您希望查询“marches”以匹配“marchés”,则需要使用French_CI_AI作为排序规则。在大多数语言中,这实际上并不是母语使用者想要的,因为重音在语义上很重要,但这可能取决于环境或背景。

实际上,如果您的用户总是希望对重音不敏感的搜索,您应该在表(或特定字段)上将该collat​​ion属性设置为AI而不是AS。否则,如果需要很少,您可以基于每个查询将排序规则应用于MS Sql中的表;请记住,如果该整理没有索引,则可能会产生大量的性能成本。但是,当您执行%通配符%查询时,这可能几乎无关紧要,因为在这种情况下,您通常会进行全表扫描。

我检查的最后一个,无法直接在Linq查询中指定排序规则,因此如果您在临时基础上执行不区分大小写,则需要使用direct-to-sql查询你的数据背景。

编辑: 根据您的评论,听起来您允许将HTML内容存储在数据库中。您的表中有数字字符引用,SQL Server一无所知,因为它们是HTML,XML和SGML的一个特性。如果这些字符是合适编码的字符串文字,则只能进行搜索。

NVARCHAR将以Unicode格式存储内容,特别是UTF-16,而VARCHAR将使用Windows-1252和法语校对。

如果您通过网络表单接受此输入,请确保页面编码是合适的。如果您只支持现代浏览器(基本上是IE5 +),UTF-8得到了很好的支持,因此您应该考虑将UTF-8用于所有请求和响应。

请确保在您的web.config中,您有以下内容:

<configuration>
   <system.web>
      <globalization
         requestEncoding="utf-8"
         responseEncoding="utf-8" />
   </system.web>
</configuration>

如果您已经在数据库中存储了包含这些数字字符引用的数据,则可以通过翻译&amp; #ddddd来取消它们。进入文字UTF-16序列,并再次存储它们。确保您不会意外地忽略语义上重要的NCR,例如大于,小于或者和号的代码点。