c# - EF Core 复杂在哪里
问题描述
我有一个使用 EF Core 的 MVC 项目。在我的控制器中,我通过 url 接收参数,其中之一是searchQuery
. 我有一个这种格式的客户表:
id | empId | empName | personId | personFirstName | personLastName
请注意,客户要么是雇主,要么是个人,而不是两者。(相应的字段将为 NULL)。这是我正在使用的查询:
collectionBeforePaging = _context.Customers
.Where(a => (a.Employer == null ? (a.Person.FirstName.Contains(searchQueryForWhereClause) ||
a.Person.LastName.Contains(searchQueryForWhereClause) ||
a.PersonId.ToString().Contains(searchQueryForWhereClause))
: (a.Employer.Name.Contains(searchQueryForWhereClause) ||
a.EmployerId.ToString().Contains(searchQueryForWhereClause))));
这项工作,虽然不是我想要的方式。如果用户搜索“Jhon Pots”,并且客户是人,那么它将检查名字是否包含“Jhon Pots”或姓氏是否包含,而不是检查名字是否包含“Jhon”并且姓氏是否包含“锅”。
我可以连接firstName
and lastName
,但它必须是完全匹配的(即它不会匹配名为“Jhon S. Pots”的客户)
我还考虑过使用该方法分解 searchQuery Split
,但我不知道如何将它与 EF Where 子句正确结合..(我不能使用 foreach 循环并过滤每个字符串,因为它会过滤我的结果通过每个字符串而不是使用OR
逻辑运算符)
有谁知道我怎样才能做到这一点?
解决方案
要执行类似 db 的比较,您可以使用EF.Functions.Like()方法。
以空格为分隔符拆分搜索词,迭代搜索词并在执行前将 where 子句添加到查询中:
string[] searchTerms = searchQueryForWhereClause.Split(' ');
var query = _context.Customers.AsQueryable();
foreach (string searchTerm in searchTerms)
{
query = query.Where(x => EF.Functions.Like(x.FirstName, $"%{searchTerm}%"
|| EF.Functions.Like(x.LastName, $"%{searchTerm}%"
|| EF.Functions.Like(x.PersonId, $"%{searchTerm}%"
|| EF.Functions.Like(x.Employer.Name, $"%{searchTerm}%"
|| EF.Functions.Like(x.EmployerId, $"%{searchTerm}%");
}
推荐阅读
- nginx - NGINX 删除 .html 扩展名(重复 - 无法正常工作)
- haskell - 为什么我只能在类型参数位置传递部分应用的类型构造函数?
- excel - Excel VBA 将一个工作表上的列中的单元格与另一工作表中的列中的单元格进行比较,如果匹配复制行
- python - 将 TIFF 图像转换为 XY 坐标
- rust - 如何为 gstreamer 源元素插件同时支持 MP3 和 WAV
- sed - Azure webapp 日志尾部解析失败
- sqlite - geograpy3:sqlite3.OperationalError:没有这样的表
- mysql - MySQL如何跨列和行获取实例数?
- javascript - React useEffect:是否可以使用变量设置依赖关系?
- swift - Swift 5 URLSession 下载 PDF 不起作用