c# - 带有 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.
请问我该如何解决?
解决方案
一切都将在服务器端完成,因此搜索是否区分大小写将由数据库排序规则决定。
也许要忽略这些事情,您应该将搜索词拆分为所有空格,并为每个空格和所有空格发送类似的声明。也许像这样的草图:
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 数据库的处理时间过长。不要忘记测量性能,并在需要时检查服务器端的一些全文索引以提高性能。
推荐阅读
- javascript - 一直滚动到 div 末尾时,无限滚动不起作用
- java - 将 PHP 中找到的 foreach 值存储到 Java
- vb.net - 使用阶乘查找组合
- ios - 在不同的滑动视图之间传递 UIPageViewController 中的数据
- amazon-web-services - AWS S3 存储桶清理但保存一定数量的文件夹
- android - Android Studio (3.2.1) Instant Run 不适用于 Jacoco 0.8.2?
- c# - 在屏幕上显示 VideoFrame
- informix - 如何在 Informix 中使用 group by?
- java - 如何在 Intellij 中阻止长时间运行的 Java 程序
- python - Otsu 阈值发现返回的值太高