其中 linq with trim 替换字符并忽略大小写

where linq with trim replace character and ignore case

我正在使用 EF,我想搜索字段名称,此搜索必须忽略字符 - space 和大小写

在我的 table 我有

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<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.

请问我该如何解决?

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

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

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 函数解释的字符,如 %_[](可能更多)。

还要注意,在 table 上执行一堆 LIKE 语句可能包含很多行,其中可能包含很多文本可能会导致 [=28 的处理时间过长=] 数据库。不要忘记衡量性能,如果需要,可能会在服务器端检查一些全文索引以提高性能。