C# linq不区分大小写(不带toUpper或toLower)
查询如何不区分大小写。我可以用toLower或toUpper,但我想用OreCase。可能吗?使用字符串.Equals和适当的参数使其不区分大小写C# linq不区分大小写(不带toUpper或toLower),c#,linq,C#,Linq,查询如何不区分大小写。我可以用toLower或toUpper,但我想用OreCase。可能吗?使用字符串.Equals和适当的参数使其不区分大小写 public Articles GetByName(string name, Categories category, Companies company) { var query = from article in session.Linq<Articles>() where article.Na
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();
}
使用
使用.equalName、StringComparison.OrdinalIgnoreCase方法代替==方法
它还将处理Name、Category、Company为null时的情况。如果这是针对具有不区分大小写排序规则的数据库的LINQ to SQL查询,那么它已经不区分大小写了。请记住,LINQtoSQL实际上并没有执行您的==调用;它将其视为一个表达式,并将其转换为SQL中的相等运算符 如果是LINQ to Objects,那么您可以像其他海报所指出的那样使用String.Equals。将其更改为
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();
如果您确定数据库支持string.EqualName、article.Name、StringComparison.OrdinalIgnoreCase,请使用它 例如,具有NOCASE副本的SQLite将忽略该选项。 Oracle使用会话设置NLS_COMP,NLS_排序将被执行
如果没有区域性问题,则使用ToLower或ToUpper。如果使用的是C 6.0,则可以定义一个简短的扩展方法,用于构造LINQ语句:
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();
}
用法:
public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
对于小于6.0的C,它将如下所示:
query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue));
哈-以前从未使用过OrdinalingOrecase-这与当前的CultureInogoreCase有什么区别?@Adam Racks:RTFM;基本上,您的解决方案考虑了当前区域性的比较规则,而我的解决方案在将两个字符串都设置为大写后进行简单的逐字节比较。一个谷歌左右的搜索会带来很多关于这个主题的信息。嗯,现在我得到的值不能为空。参数名称:LeftEnd是否确定?String.Equals应该能够接受null作为参数。如果我使用toUpper,那么我得到的索引超出范围。必须为非负数且小于集合的大小。参数名称:索引。仅适用于我粘贴的代码…FirstOrDefault可能返回null,您可能在不首先检查的情况下使用它。稍微分解一下代码,确保String.Equals是失败的,因为String.Equals应该能够接受null作为参数。NH的Linq解析器可能会被String.Equals搞混?可以肯定的是,您使用的是String.equals1、s2而不是str.Equalsstr2,对吗?不一定支持这种特定的解决方案。例如,在SQLServer2008上使用Linq2SQL:方法“Boolean EqualSystem.String,System.String,System.StringComparison”不支持到SQL的转换。类似地,“Boolean EqualSystem.String,System.StringComparison”不支持转换为SQL。@mcdrewski实际上为调用方法“Boolean EqualSystem.String,System.String,System.StringComparison”提供的参数数量不正确,即使我清楚地提供了所需的参数。我认为使用EF4可能是一个bug。@drzaus使用属性中的Equals方法而不是类型中的静态方法来回答Edgar的问题。请注意String.Equals和StringComparison与LINQ的结合。根据数据库系统的不同,可以忽略该选项。例如SQLite或Oracle。可能与
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();
}
public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue));
public static bool EqualsInsensitive(this string str, string value)
{
return string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase);
}