使用LINQ对字符串进行修剪、替换字符和忽略大小写。

39 浏览
0 Comments

使用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 Task FindAsync(Expression> match)
        {
            return await _databaseContext.user.FirstOrDefaultAsync(match).ConfigureAwait(false);
        }

但是我遇到了EF错误:

The LINQ expression 'DbSet where (.....) could not be translated.

请问我该如何解决这个问题?

0
0 Comments

在服务器端完成所有操作,所以搜索是区分大小写还是不区分大小写将由数据库排序方式决定。

也许为了忽略这样的情况,你应该将搜索条件按照所有空格分割,并为每个条件发送一个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数据库的巨大处理时间。不要忘记测量性能,并在需要时检查服务器端的全文索引以提高性能。

0