【问题标题】:linq search for French characterslinq 搜索法语字符
【发布时间】:2011-05-18 01:53:52
【问题描述】:

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

当 searchtext 包含 "march" 时,它会找到例如。 "des marchés",但如果我搜索 "marché",它不会找到。所以它是法语字符。

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

数据库和表Agenda具有扩展属性->排序规则:French_CI_AS

那么我怎样才能确保我也能听懂法语单词呢?比如“é,à”等

我也尝试搜索"marche",但没有找到"marchés"

【问题讨论】:

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


    【解决方案1】:

    您的排序规则 French_CI_AS 是“不区分大小写”、“区分重音”。如果您希望查询“marches”以匹配“marchés”,则需要 French_CI_AI 作为排序规则。在大多数语言中,这实际上不是以母语为母语的人想要的,因为口音在语义上很重要,但这可能取决于环境或上下文。

    事实上,如果您的用户确实总是想要不区分重音的搜索,那么您应该在表格(或特定字段)上将该排序规则属性设置为 AI 而不是 AS。否则,如果需要很少,您可以在 MS Sql 中按查询对表应用排序规则;请记住,如果该排序规则上没有索引,则可能会产生大量性能成本。但是,当您执行 %wildcard% 查询时,这可能几乎无关紧要,因为在这种情况下您通常会进行全表扫描。

    我上次检查时,无法直接在 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>
    

    如果您已经在数据库中存储了这些数字字符引用的数据,您可以通过翻译 ddddd; 来取消转义它们。转换成文字 UTF-16 序列,然后再次存储它们。确保您不会意外取消转义语义上重要的 NCR,例如大于、小于或与号代码点。

    【讨论】:

    • 我将该特定列的排序规则从 French_CI_AS 更改为 French_CI_AI,但仍然找不到。如果它与“marchés”一起使用,我会很高兴,但更好的是“marchés”和“marches”。我需要进行其他更改吗?我无法创建另一个普通的 sql,因为这个 LINQ 语句已经很复杂。我只是在这个例子中进行了简化。所以我应该用 LINQ 解决这个问题。但我可以对表格或列进行任何更改...
    • 我只看到它包含的表格中的文本是这样的:Séminaire consacré à la gestion des Marchés publics 所以这就是它找不到的原因?有人提出解决方案吗?
    • 您的数据库中显然有 HTML。 SQL Server 并不真正了解 HTML,因此它不会找到它。您需要将这些 NCR 存储为字符串文字。我在上面做了一些笔记。
    • 哇...谢谢杰森...我的 web.config 中已经有了全球化标签,正如您所描述的。我只需要搜索。你能举个例子(编码)如何翻译吗?所以用户正在输入“marchés”,我需要将其翻译成 Marchés 。我可以使用替换功能 textbox.text.replace("é","é")... 但我假设您正在谈论另一个翻译功能。你能举一个编码的例子吗?非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多