此代码区分大小写,如何使其不区分大小写?
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)
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()进行操作.
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)
Mar*_*rko 11
这里接受的答案没有提到一个事实,如果你有一个空字符串ToLower()将抛出异常.更安全的方法是:
fi => (fi.DESCRIPTION ?? string.Empty).ToLower().Contains((description ?? string.Empty).ToLower())
Run Code Online (Sandbox Code Playgroud)
IndexOf 在这种情况下效果最好
return this
.ObjectContext
.FACILITY_ITEM
.Where(fi => fi.DESCRIPTION.IndexOf(description, StringComparison.OrdinalIgnoreCase)>=0);
Run Code Online (Sandbox Code Playgroud)
对于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)
老实说,这并不难。一开始似乎是这样,但事实并非如此。下面是一个用 C# 编写的简单 linq 查询,它完全按照要求执行。
在我的示例中,我正在处理具有名为 FirstName 的属性的人员列表。
var results = ClientsRepository().Where(c => c.FirstName.ToLower().Contains(searchText.ToLower())).ToList();
Run Code Online (Sandbox Code Playgroud)
这将在小写搜索中搜索数据库,但返回完整大小写结果。
| 归档时间: |
|
| 查看次数: |
159222 次 |
| 最近记录: |