LINQ包含大小写不敏感

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

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

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

.Where(a => a.Field.Contains("hello"))变成了Field LIKE '%hello%'LIKE运算符在默认情况下不区分大小写,但可以通过更改列的sorting规则来更改。

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

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

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

假设我们在这里使用string,这里是使用IndexOf()的另一个“优雅”解决scheme。

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

这里接受的答案没有提到一个事实,如果你有一个空stringToLower()会抛出一个exception。 更安全的方法是做:

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

IndexOf在这种情况下效果最好

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

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

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

使用Enumerable.Contains(IEnumerable,TSource,IEqualityComparer)方法,使用一个StringComparer .___ IgnoreCase比较器(Ordinal,InvariantCulture或CurrentCulture)。

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

你可以使用string.Compare

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

如果你只是想检查包含然后使用“任何”

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