【问题标题】:How to search string using Entity Framework with .Contains and with accent-insensitive如何使用带有 .Contains 和不区分重音的实体框架搜索字符串
【发布时间】:2016-02-16 18:28:21
【问题描述】:

在我的数据库中,我有一个存储城市的表。有些城市有“Foz do Iguaçu”之类的口音。

在我的 MVC 应用程序中,我有一个 JSON,它返回基于单词的城市列表,但是,很少有用户不使用口音来搜索城市,例如“Foz do Iguacu”。

在我的数据库中,我有“Foz do IguaÇu”,但用户 用户搜索“Foz do IguaCu”

如何在表格中搜索记录,忽略重音符号?

这是我的代码:

    using (ServiciliEntities db = new ServiciliEntities())
    {
        List<Cidades> lCidades = db.Cidades.Where(c => c.CidNome.ToLower().Contains(q.Trim().ToLower())).OrderBy(c => c.CidNome).Take(10).ToList();
        ArrayList lNomes = new ArrayList();
        foreach (Cidades city in lCidades)
            lNomes.Add(new {city.CidNome, city.Estados.EstNome});

        return Json(new { data = lNomes.ToArray() });
    }

【问题讨论】:

    标签: c# entity-framework diacritics accent-insensitive


    【解决方案1】:

    解决方法如下:

    ALTER TABLE dbo.YourTableName
    ALTER COLUMN YourColumnName NVARCHAR (100) COLLATE SQL_Latin1_General_CP1_CI_AI NULL
    

    其中 LATIN1_GENERAL 表示英语(美国),CI 表示不区分大小写,AI 表示不区分重音。

    【讨论】:

      【解决方案2】:

      您可以在数据库中的列上设置不区分重音排序顺序。然后查询应该可以工作。例如,如果您将 SQL_LATIN1_GENERAL_CP1_CI_AI 设置为 CidNome 列,查询将按需要执行。

      使用这个 SQL 脚本:

      ALTER TABLE dbo.YourTableName
      ALTER COLUMN YourColumnName NVARCHAR (100) COLLATE SQL_Latin1_General_CP1_CS_AS NULL
      

      【讨论】:

      • 有没有办法在不改变列的情况下做到这一点?
      • 好吧,实际上我不这么认为..最后,Entity Framework 所做的所有事情都是将您的查询转换为 SQL..真正的比较必须对数据库进行..如果您会使用一些 hack ,必然导致性能下降。那么为什么不能更改列呢?
      • @PetrAdam 是对的。这是使用的解决方案。顺便说一句,您可以为整个数据库或整个数据库服务器配置排序规则。后者为将要创建的每个数据库启用该功能。
      • @Dan 你可以检查一下 => stackoverflow.com/questions/12054930/…
      • 我的列已经设置为 COLLATE SQL_Latin1_General_CP1_CS_AS,但仍然没有用。
      猜你喜欢
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2011-09-15
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多