AnyCase使用LINQ搜索

时间:2013-02-12 10:40:18

标签: c# linq

我有一个LINQ语句如下:

myList = MyList.Where(x => 
    x.Name.Contains(SearchValue) ||
    x.Address.Contains(SearchValue)).ToList();

我的数据库可以为Name字段设置大写或小写,例如'VSTS'或'vsts'
我希望我的LINQ语句可以执行任何情况。

在上面的LINQ语句中,如果我提供小写值并且数据库具有大写,则搜索失败..这是我不想要的。

5 个答案:

答案 0 :(得分:3)

最佳选择是使用序数不区分大小写的比较,但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));

答案 1 :(得分:1)

使用以下内容:

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();

答案 2 :(得分:0)

试试这个:

myList = MyList.Where(x => 
    x.Name.ToLower().Contains(SearchValue.ToLower()) || 
    x.Address.ToLower().Contains(SearchValue.ToLower())).ToList();

检查这是否适用于Linq2Entity,可能是tolower失败:p

答案 3 :(得分:0)

您可以尝试ToLower()

myList = MyList.Where(x => x.Name.ToLower().Contains(SearchValue.ToLower()) 
    || x.Address.ToLower().Contains(SearchValue.ToLower())).ToList();

答案 4 :(得分:0)

如果你需要使用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();