【问题标题】:LINQ case sensitiveLINQ 区分大小写
【发布时间】:2011-02-24 12:16:30
【问题描述】:

如何根据情况使LINQ区分大小写和不区分大小写?

我使用的是 sql server 2008 和 Entity Framework 4.0。

我更改了 COLLATION 以使 SQL Server 区分大小写。所以对于这样的场景:

 query = query.Where(x => x.Username == username);

效果很好。 但是,当按主题(或名称或类似名称)搜索时,我需要能够从 db ignoring case 中提取数据,如下所示:

query = query.Where(x => (x.Name.Contains(Name)));

当记录是“TestString”并且我正在寻找“test”或“Test”或类似时,它不起作用。我将如何使它在文本中找到文本或字符串的一部分时? 谢谢

【问题讨论】:

  • 使用 ToUpper/Lower 解决方案或编写类似这样的 SQL 查询:SELECT * FROM tblUser WHERE tblUser.userName = 'test' COLLATE Finnish_Swedish_CI_AS

标签: sql linq linq-to-entities


【解决方案1】:

LINQ 没有区分大小写的概念,它只关心布尔求值。所以如果你想忽略大小写,你应该这样做:

query = query.Where(x => (x.Name.ToLower().Contains(Name.ToLower())));

您可能希望将 CultureInfo 传递给 ToLower()(或使用 ToLowerInvariant()),并且您可能希望缓存 Name.ToLower() 的结果,以便不必执行该操作可能很大次数,但这应该可以帮助您开始。

【讨论】:

    【解决方案2】:
    query = query.Where(x => string.Equals(x.Name, Name, StringComparison.CurrentCultureIgnoreCase));
    

    【讨论】:

      【解决方案3】:

      阅读我对此的回复:

      String.Equals() not working as intended

      这不是你想要的回复,可能:-)

      啊...如果您必须转换为相同的大小写进行比较,ToUpper 比 ToLower 更好。不要问我为什么。但你可以在这里阅读:Case insensitive string compare in LINQ-to-SQL

      【讨论】:

        【解决方案4】:

        Queryable.Contains 有一个重载,使用 IEqualityComparer<T> 进行比较。见msdn。如果您提供不区分大小写的比较器,这应该可以工作 - 我很确定框架中已经有一个。

        【讨论】:

        • 我认为 IEqualityComparer 仅在 Linq to objects 中受支持
        猜你喜欢
        • 1970-01-01
        • 2015-06-19
        • 2023-04-02
        • 2011-04-20
        • 2021-07-05
        • 2015-01-22
        • 1970-01-01
        • 2010-12-02
        • 2012-12-01
        相关资源
        最近更新 更多