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

sen*_*ale 57 c# linq

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();
}
Run Code Online (Sandbox Code Playgroud)

如何查询不区分大小写.我可以使用toLower或toUpper但我想使用OrdinalIgnoreCase.可能吗?

Ada*_*kis 89

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

mySource.Where(s => String.Equals(s, "Foo", StringComparison.CurrentCultureIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

  • 你确定吗?`String.Equals` 应该能够接受 null 作为参数。 (2认同)
  • FirstOrDefault可能返回null,您可能在没有首先检查的情况下使用它.稍微分解你的代码并确保String.Equals是失败的,因为String.Equals应该能够接受null作为参数 (2认同)
  • 可能吧 NH的Linq解析器可能会与String.Equal混淆?可以肯定的是,您使用的是String.Equals(s1,s2)而不是str.Equals(str2),对吗? (2认同)

Edg*_*gar 43

相反,如果==使用该.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();
Run Code Online (Sandbox Code Playgroud)

  • 请将String.Equals()和StringComparison与LINQ结合使用.根据数据库系统,可以忽略该选项.例如SQLite或Oracle. (8认同)

Joh*_*soe 18

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

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


Ste*_*cya 8

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();
Run Code Online (Sandbox Code Playgroud)

它还将处理名称,类别,公司的时间 null

  • 此特定解决方案不一定受支持。例如,在 SQLServer2008 上使用 Linq2SQL:`方法 'Boolean Equals(System.String, System.String, System.StringComparison)' 不支持对 SQL 的转换。` 类似: `'Boolean Equals(System.String, System.StringComparison) ' 不支持 SQL 转换。` (2认同)

Dan*_*rth 6

String.Equals(article.Name, name, StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

  • 嗯 - 以前从未使用过 `OrdinalIgnoreCase` - 那和 `CurrentCultureIgnoreCase` 有什么区别? (2认同)

Ale*_*xei 5

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

public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

用法:

query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue));
Run Code Online (Sandbox Code Playgroud)

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

public static bool EqualsInsensitive(this string str, string value) 
{
    return string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)