LINQ 判断是否包含(不区分大小写)

这段代码是区分大小写的,如何使它不区分大小写?

public IQueryable GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
208981 次浏览
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())

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

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

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

< p > .Where(a => a.Field.Contains("hello")) 成为Field LIKE '%hello%'LIKE操作符默认不区分大小写,但可以通过更改列的排序规则更改

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

将CultureInfo作为参数的LINQ到SQL 不支持方法,可能是因为它不能保证SQL服务器处理与. net相同的区域性。这并不完全正确,因为它支持StartsWith(string, StringComparison)

然而,它似乎不支持在LINQ to SQL中计算为LIKE的方法,也不支持在. net中计算为不区分大小写的比较的方法,因此不可能以一致的方式执行不区分大小写的Contains()。

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

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

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

IndexOf在这种情况下工作得最好

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

使用c# 6.0(允许表达式体函数和null传播),对于LINQ to Objects,它可以在单行中完成,就像这样(也检查null):

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

你可以用字符串。比较

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

如果你只是想检查包含,那么使用Any

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

使用字符串。=方法

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

接受StringComparison。InvariantCultureIgnoreCase只是做我的工作:

.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));

说实话,这没什么难的。刚开始看起来是这样,但其实不是。下面是c#中一个简单的linq查询,它完全按照请求执行。

在我的示例中,我使用的是具有一个名为FirstName属性的人员列表。

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

这将对数据库进行小写搜索,但返回完整的大小写结果。