LINQ包含不区分大小写

Jea*_*ert 168 c# linq

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

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

Nea*_*alv 236

fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())
Run Code Online (Sandbox Code Playgroud)

  • 包含应该使用`IEqualityComparer <string>`属性来处理比较的工作方式.使用ToLower和ToUpper来检查相等性是一个坏主意.尝试:`.Contains(description,StringComparer.CurrentCultureIgnoreCase)`例如 (63认同)
  • 正如[Jon Skeet](http://stackoverflow.com/users/22656/jon-skeet)对[相关问题](http://stackoverflow.com/a/444813/161052)发表评论,这种方法不会通过[土耳其测试](http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html). (47认同)
  • 来自@Dorival的评论不起作用,因为它给出了这个错误消息:`错误1'字符串'不包含'包含'的定义和最佳扩展方法重载'System.Linq.ParallelEnumerable.Contains <TSource>(System.Linq .ParallelQuery <TSource>,TSource,System.Collections.Generic.IEqualityComparer <TSource>)'有一些无效的参数` (19认同)
  • 带有`StringComparer`的`Contains`不接收字符串作为参数,因此它将是build-error.`Queryable`上的`IndexOf`可能无法转换为SQL.就个人而言,当我们谈到LINQ to database时,我发现这个答案完全有效. (6认同)
  • 不,但数据库可以处理字符集和整理.如果你试图将工作推向数据库,你必须对字符集和整理做出一些假设,对吧? (5认同)
  • 如果你打算使用fi => fi.DESCRIPTION.ToLower().包含(description.ToLower())你应该首先将小写值存储在一个变量中(var desc = description.ToLower()),这样你就不会为记录集中的每个项重复ToLower(). (4认同)
  • @Dorival的评论应该是答案. (3认同)
  • 有很多方法可以做到这一点,总是建议使用Equality.另一种方式,甚至更快,可以使用`IndexOf`方法:`.Where(fi => fi.DESCRIPTION.IndexOf(description,StringComparison.OrdinalIgnoreCase)> = 0));`.Jeff Mercado在本页中建议作为答案的解决方案. (2认同)

Sjo*_*erd 112

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

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

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

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

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

  • 为挖掘 LIKE 子句生成的 SQL 和数据库行为付出了巨大的努力 (2认同)

Jef*_*ado 66

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

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

  • 尼斯.但是出于我自己的目的,这对于LINQ to Entities不起作用.LINQ to Objects的很好的解决方案. (7认同)

Mar*_*rko 11

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

fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())
Run Code Online (Sandbox Code Playgroud)


Men*_*gis 5

IndexOf 在这种情况下效果最好

return this
   .ObjectContext
   .FACILITY_ITEM
   .Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);
Run Code Online (Sandbox Code Playgroud)


Ale*_*xei 5

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

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


Fra*_*mas 5

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

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

var results = ClientsRepository().Where(c => c.FirstName.ToLower().Contains(searchText.ToLower())).ToList();
Run Code Online (Sandbox Code Playgroud)

这将在小写搜索中搜索数据库,但返回完整大小写结果。