首页 > 解决方案 > 带有 trim 的 linq 替换字符并忽略大小写

问题描述

我正在使用 EF,我想对字段名称进行搜索,此搜索必须忽略字符 - 以及空格和大小写

在我的桌子上我有

id Name
1  Jean -philippe

当我在我的请求上进行搜索时,有时我有jeanphilippe,有时jean philippe

我需要将其与 db 上的记录相匹配,例如:

await repository.FindAsync(m=>m.Name.ToLower().Replace("-", string.Empty).Trim()==request.Name.ToLower().Replace("-", string.Empty).Trim())

 public async Task<User> FindAsync(Expression<Func<User, bool>> match)
        {
            return await _databaseContext.user.FirstOrDefaultAsync(match).ConfigureAwait(false);
        }

但我有 EF 错误

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

请问我该如何解决?

标签: c#entity-frameworklinqentity-framework-core

解决方案


一切都将在服务器端完成,因此搜索是否区分大小写将由数据库排序规则决定。

也许要忽略这些事情,您应该将搜索词拆分为所有空格,并为每个空格和所有空格发送类似的声明。也许像这样的草图:

var name = "Foo -Bar";
var cleanedName = name
    //.Replace(".", string.Empty)  // Maybe other characters to remove before search
    .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 数据库的处理时间过长。不要忘记测量性能,并在需要时检查服务器端的一些全文索引以提高性能。


推荐阅读