使用LINQ对字符串进行修剪、替换字符和忽略大小写。
使用LINQ对字符串进行修剪、替换字符和忽略大小写。
我正在使用EF,并且想要在字段Name上进行搜索,这个搜索必须忽略字符“-”和空格,以及大小写。在我的表上,我有如下数据:
id Name 1 Jean -philippe
当我在请求中进行搜索时,有时我会输入jeanphilippe
,有时会输入jean philippe
。我需要将其与数据库中的记录匹配,代码如下:
await repository.FindAsync(m=>m.Name.ToLower().Replace("-", string.Empty).Trim()==request.Name.ToLower().Replace("-", string.Empty).Trim()) public async TaskFindAsync(Expression > match) { return await _databaseContext.user.FirstOrDefaultAsync(match).ConfigureAwait(false); }
但是我遇到了EF错误:
The LINQ expression 'DbSetwhere (.....) could not be translated.
请问我该如何解决这个问题?
在服务器端完成所有操作,所以搜索是区分大小写还是不区分大小写将由数据库排序方式决定。
也许为了忽略这样的情况,你应该将搜索条件按照所有空格分割,并为每个条件发送一个like语句,然后用AND连接所有条件。可能是这样的一个示例:
var name = "Foo -Bar"; var cleanedName = name //.Replace(".", string.Empty) // 在搜索之前可能需要删除其他字符 .Replace("-", string.Empty); var elements = cleanedName.Split(); IQueryable<Foo> query = respository.Foo; foreach (var element in elements) { query = query.Where(foo => EF.Functions.Like(foo.Name, $"%{element}%")); } var results = await query.ToListAsync();
请注意,这只是一个草图。特别是直接使用element
可能会产生错误的结果,如果用户输入的搜索条件包含被数据库的LIKE
函数解释为%
、_
、[
或]
(可能还有其他)的字符。
还要注意,在可能包含大量文本的表上执行一系列LIKE
语句可能会导致SQL数据库的巨大处理时间。不要忘记测量性能,并在需要时检查服务器端的全文索引以提高性能。