该代码区分大小写,如何使其不区分大小写?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
该代码区分大小写,如何使其不区分大小写?
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description));
}
Answers:
假设我们在这里使用字符串,这是另一个使用的“优雅”解决方案IndexOf()
。
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.IndexOf(description, StringComparison.OrdinalIgnoreCase) != -1);
}
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())
IEqualityComparer<string>
属性来处理比较的工作方式。使用ToLower和ToUpper检查相等性是一个坏主意。试试:.Contains(description, StringComparer.CurrentCultureIgnoreCase)
例如
Error 1 'string' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)' has some invalid arguments
Contains
与StringComparer
不会接收字符串作为参数,因此会出现构建错误。IndexOf
上Queryable
可能不能转换成SQL。我个人认为当我们谈到数据库的LINQ时,这个答案是完全有效的。
如果LINQ查询是在数据库上下文中执行的,则对的调用将Contains()
映射到LIKE
运算符:
.Where(a => a.Field.Contains("hello"))
成为Field LIKE '%hello%'
。LIKE
默认情况下,该运算符不区分大小写,但是可以通过更改column的排序规则来更改。
如果LINQ查询是在.NET上下文中执行的,则可以使用IndexOf(),但是LINQ to SQL不支持该方法。
LINQ to SQL 不支持将CultureInfo作为参数的方法,这可能是因为它不能保证SQL Server处理与.NET相同的区域性。这并非完全正确,因为它确实支持StartsWith(string, StringComparison)
。
但是,它似乎不支持LIKE
在LINQ to SQL中求值的方法以及在.NET中不区分大小写的比较的方法,从而不可能以一致的方式执行不区分大小写的Contains()。
insensitive
搜索,在另一种情况下,我需要进行大小写搜索case sensitive
。我是否只需要敲击性能并使用'toLower()'?
此处接受的答案没有提及以下事实:如果您具有空字符串,则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);
您可以使用string.Compare
lst.Where(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0);
如果您只想检查包含,则使用“任何”
lst.Any(x => string.Compare(x,"valueToCompare",StringComparison.InvariantCultureIgnoreCase)==0)
public static bool Contains(this string input, string findMe, StringComparison comparisonType)
{
return String.IsNullOrWhiteSpace(input) ? false : input.IndexOf(findMe, comparisonType) > -1;
}
.Where(fi => fi.DESCRIPTION.Contains(description, StringComparison.InvariantCultureIgnoreCase));
使用String.Equals方法
public IQueryable<FACILITY_ITEM> GetFacilityItemRootByDescription(string description)
{
return this.ObjectContext.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION
.Equals(description, StringComparison.OrdinalIgnoreCase));
}