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)