LINQ包含不区分大小写

时间:2010-07-29 08:49:15

标签: c# linq

此代码区分大小写,如何使其不区分大小写?

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}

10 个答案:

答案 0 :(得分:230)

fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())

答案 1 :(得分:111)

如果在数据库上下文中执行LINQ查询,则对Contains()的调用将映射到LIKE运算符:

.Where(a => a.Field.Contains("hello"))  变为Field LIKE '%hello%'LIKE运算符默认情况下不区分大小写,但可以通过changing the collation of the column进行更改。

如果在.NET上下文中执行LINQ查询,则可以使用IndexOf(),但LINQ to SQL不支持该方法。

将CultureInfo作为参数的LINQ to SQL does not support methods,可能是因为它无法保证SQL服务器处理与.NET相同的文化。这不完全正确,因为 支持StartsWith(string, StringComparison)

但是,它似乎不支持在LINQ to SQL中求值为LIKE的方法,以及.NET中不区分大小写的比较,从而无法以一致的方式对不区分大小写的Contains()进行操作

答案 2 :(得分:60)

假设我们在这里使用字符串,这是使用IndexOf()的另一个“优雅”解决方案。

public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
    return this.ObjectContext.FACILITY_ITEM
        .Where(fi => fi.DESCRIPTION
                       .IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}

答案 3 :(得分:11)

这里接受的答案没有提到一个事实,如果你有一个空字符串ToLower()将抛出异常。更安全的方法是:

fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())

答案 4 :(得分:5)

使用C#6.0(允许表达式身体函数和空传播),对于LINQ to Objects,它可以在一行中完成(也检查null):

public static bool ContainsInsensitive(this string str, string value) => str?.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;

答案 5 :(得分:4)

在这种情况下,IndexOf效果最佳

return this
   .ObjectContext
   .FACILITY_ITEM
   .Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);

答案 6 :(得分:3)

您可以使用string.Compare

    lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);

如果您只想查看包含,请使用&#34;任何&#34;

  lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)

答案 7 :(得分:1)

public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
    return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}

答案 8 :(得分:0)

  

StringComparison.InvariantCultureIgnoreCase替我做这件事:

d = {'case': [1,2,3,4,5], 'registration_datetime': ['2013-01-01 
00:00:16','2013-01-01 00:04:19','2013-01-01 00:12:53','2013-01-02 
00:16:40','2013-01-02 00:21:40'],'discharge_datetime':['2013-01-01 
01:41:02','2013-01-01 04:20:05
','2013-01-01 06:20:22
','2013-01-02 02:01:13
','2013-01-02 05:48:49
']}

df=pd.DataFrame(data=d)

spe_dates = DatetimeIndex(['2013-01-01', '2013-01-15',...])

答案 9 :(得分:0)

老实说,这并不困难。似乎一开始就是这样,但事实并非如此。这是一个完全按照要求执行的C#中的简单linq查询。

在我的示例中,我正在处理具有一个名为FirstName的属性的人员列表。

var results = ClientsRepository().Where(c => c.FirstName.ToLower().Contains(searchText.ToLower())).ToList();

这将以小写形式搜索数据库,但返回完整大小写的结果。