使用LINQ的AnyCase搜索
本文关键字:搜索 AnyCase LINQ 使用 | 更新日期: 2023-09-27 17:58:51
我有一个LINQ语句,如下所示:
myList = MyList.Where(x =>
x.Name.Contains(SearchValue) ||
x.Address.Contains(SearchValue)).ToList();
"我的数据库"的Name
字段可以有大小写,如"VSTS"或"VSTS"
我希望我的LINQ语句在任何情况下都能执行。
在上面的LINQ语句中,如果我提供了小写值,而数据库的大小写为大写,则搜索失败。。这是我不想要的。
最好的选择是使用不区分大小写的序数比较,但是Contains
方法不支持它,所以您的另一个选择是使用string.IndexOf
。
最好将其封装在扩展方法中,例如:
public static bool Contains(this string target, string value, StringComparison comparison)
{
return target.IndexOf(value, comparison) >= 0;
}
所以你可以使用:
myList.Where(x => x.Name.Contains(SearchValue, StringComparison.OrdinalIgnoreCase) ||
x.Address.Contains(SearchValue, StringComparison.OrdinalIgnoreCase));
使用以下内容:
myList = MyList.Where(x =>
x.Name.ToUpper(CultureInfo.InvariantCulture).Contains(
SearchValue.ToUpper(CultureInfo.InvariantCulture)) ||
x.Address.ToUpper(CultureInfo.InvariantCulture).Contains(
SearchValue.ToUpper(CultureInfo.InvariantCulture))).
ToList();
试试这个:
myList = MyList.Where(x =>
x.Name.ToLower().Contains(SearchValue.ToLower()) ||
x.Address.ToLower().Contains(SearchValue.ToLower())).ToList();
检查这是否适用于Linq2Entity,可能是tolower失败:p
您可以尝试ToLower()
:
myList = MyList.Where(x => x.Name.ToLower().Contains(SearchValue.ToLower())
|| x.Address.ToLower().Contains(SearchValue.ToLower())).ToList();
如果您需要使用Contains(),请尝试以下操作:
var svUP = SearchValue.ToUpper();
myList = MyList.Where(x => x.Name.ToUpper().Contains(svUP ) || x.Address.ToUpper().Contains(svUP )).ToList();
但若您的字段包含完整的搜索值,而唯一的问题是大小写,那个么您应该将Equals()与StingComparison一起使用:
myList = MyList.Where(x => x.Name.Equals(SearchValue, StringComparison.InvariantCultureIgnoreCase) || x.Address.Equals(SearchValue, StringComparison.InvariantCultureIgnoreCase)).ToList();