eth*_*hem 5 c# globalization linq-to-entities collation
我是 EF 并且有一个简单的 LINQ 语句并且想要搜索单词。所以有文本框搜索和提交按钮。
当搜索文本包含"march"它时,它会找到例如。"des marchés",但如果我搜索"marché"它没有找到。所以这是法国人的性格。
listAgendaItems = dc.agenda.Where(a =>
a.libelle_activite.Contains(searchText)
).ToList<agenda>();
Run Code Online (Sandbox Code Playgroud)
数据库和表Agenda具有扩展属性 -> 排序规则:French_CI_AS
那么我怎样才能确保我也能得到法语单词呢?像“é,à”等
我也尝试搜索,"marche"但没有找到"marchés"。
您的排序规则 French_CI_AS 是“不区分大小写”、“区分重音”。如果您希望“游行”的查询与“march\xc3\xa9s”匹配,则需要 French_CI_AI 作为排序规则。在大多数语言中,这实际上并不是母语人士想要的,因为重音在语义上很重要,但这可能取决于情况或上下文。
\n\n事实上,如果您的用户确实总是想要不区分重音的搜索,您应该将该排序规则属性设置为 AI,而不是表(或特定字段)上的 AS。否则,如果很少需要,您可以在每个查询的基础上对 MS Sql 中的表应用排序规则;请记住,如果该排序规则没有索引,则可能会产生巨大的性能成本。然而,当您执行 %wildcard% 查询时,这可能几乎无关紧要,因为无论如何在这种情况下您通常都会进行全表扫描。
\n\n我上次检查时,无法直接在 Linq 查询中指定排序规则,因此,如果您在临时基础上不区分大小写,则需要通过您的数据上下文。
\n\n编辑:\n根据您的评论,听起来您正在允许 HTML 内容存储在数据库中。表中有数字字符引用,SQL Server 对此一无所知,因为它们是 HTML、XML 和 SGML 的功能。仅当这些字符是采用合适编码的字符串文字时,才可以使其可搜索。
\n\nNVARCHAR 将以 Unicode(特别是 UTF-16)存储内容,而 VARCHAR 将使用带有法语排序规则的 Windows-1252。
\n\n如果您通过 Web 表单接受此输入,请确保页面编码适当。如果您仅支持现代浏览器(基本上是 IE5+),则可以很好地支持 UTF-8,因此您应该考虑对所有请求和响应使用 UTF-8。
\n\n确保在你的 web.config 中有这样的内容:
\n\n<configuration>\n <system.web>\n <globalization\n requestEncoding="utf-8"\n responseEncoding="utf-8" />\n </system.web>\n</configuration>\nRun Code Online (Sandbox Code Playgroud)\n\n如果您的数据库中已经存储了使用这些数字字符引用存储的数据,则可以通过翻译 &#ddddd; 来取消转义它们。转换为文字 UTF-16 序列,然后再次存储它们。确保您不会意外转义语义上重要的 NCR,例如大于、小于或与号代码点。
\n