其中 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 的处理时间过长=] 数据库。不要忘记衡量性能,如果需要,可能会在服务器端检查一些全文索引以提高性能。
我正在使用 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 的处理时间过长=] 数据库。不要忘记衡量性能,如果需要,可能会在服务器端检查一些全文索引以提高性能。