这段代码是区分大小写的,如何使它不区分大小写?
public IQueryable GetFacilityItemRootByDescription(string description) { return this.ObjectContext.FACILITY_ITEM.Where(fi => fi.DESCRIPTION.Contains(description)); }
fi => fi.DESCRIPTION.ToLower().Contains(description.ToLower())
假设我们在这里处理的是字符串,这里有另一个使用IndexOf()的“优雅”解决方案。
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操作符:
Contains()
LIKE
.Where(a => a.Field.Contains("hello"))
Field LIKE '%hello%'
如果LINQ查询在. net上下文中执行,则可以使用IndexOf (),但LINQ to SQL不支持该方法。
将CultureInfo作为参数的LINQ到SQL 不支持方法,可能是因为它不能保证SQL服务器处理与. net相同的区域性。这并不完全正确,因为它做支持StartsWith(string, StringComparison)。
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();
这将对数据库进行小写搜索,但返回完整的大小写结果。