不区分大小写的 LINQ(没有 toUpper 或 toLower)

问题描述 投票:0回答:8
public Articles GetByName(string name, Categories category, Companies company)
{
    var query = from article in session.Linq<Articles>()
                where article.Name == name &&
                      article.Category == category &&
                      article.Company == company
                select article;
    return query.FirstOrDefault();
}

如何让LINQ查询不区分大小写?我可以使用

toLower()
toUpper()
,但我想使用
OrdinalIgnoreCase
代替。可以吗?

c# linq case-insensitive
8个回答
122
投票

String.Equals
与适当的参数一起使用,使其不区分大小写

mySource.Where(s => String.Equals(s, "Foo", StringComparison.CurrentCultureIgnoreCase));

62
投票

使用

==
方法代替
.Equals(name, StringComparison.OrdinalIgnoreCase)

var query = from article in session.Linq<Articles>()
            where article.Name.Equals(name, StringComparison.OrdinalIgnoreCase) &&
                  article.Category.Equals(category) &&
                  article.Company.Equals(company)
            select article;

return query.FirstOrDefault();

29
投票

如果这是针对具有不区分大小写排序规则的数据库的 LINQ to SQL 查询,则它已经是不区分大小写的。请记住,LINQ to SQL 实际上并不执行您的 == 调用;而是执行您的 == 调用。它将它视为一个表达式并将其转换为 SQL 中的相等运算符。

如果是 LINQ to Objects,那么您可以使用 String.Equals,正如其他海报所指出的那样。


9
投票
var query = from article in session.Linq<Articles>()
           where string.Equals(article.Name,name, StringComparison.OrdinalIgnoreCase) &&
                 string.Equals(article.Category,category, StringComparison.OrdinalIgnoreCase) &&
                 string.Equals(article.Company,company, StringComparison.OrdinalIgnoreCase)
                        select article;

            return query.FirstOrDefault();

当名称、类别、公司为

null

时也会处理

7
投票

使用

String.Equals(article.Name, name, StringComparison.OrdinalIgnoreCase)

6
投票

如果您使用 C# 6.0,您可以定义在构造 LINQ 语句时使用的简短扩展方法:

public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);

用途:

query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue));

对于低于 6.0 的 C#,它将如下所示:

public static bool EqualsInsensitive(this string str, string value) 
{
    return string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
}

0
投票

更改为

public Articles GetByName(string name, Categories category, Companies company)
        {
    var query = from article in session.Linq<Articles>()
                            where string.Equals(article.Name, StringComparison.CurrentCultureIgnoreCase)  == name &&
                                string.Equals(article.Category, StringComparison.CurrentCultureIgnoreCase == category &&
                                string.Equals(article.Company, StringComparison.CurrentCultureIgnoreCase == company
                            select article;

                return query.FirstOrDefault();
}

0
投票

您确定您的数据库支持它时,请使用 string.Equals(name,article.Name, StringComparison.OrdinalIgnoreCase)。

例如具有 NOCASE 排序规则的 SQLite 将忽略该选项。 Oracle 使用将要采用的会话设置 NLS_COMP、NLS_SORT。

如果没有文化问题,请使用 ToLower() 或 ToUpper()。

© www.soinside.com 2019 - 2024. All rights reserved.