首页 > 解决方案 > 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”并且姓氏是否包含“锅”。

我可以连接firstNameand lastName,但它必须是完全匹配的(即它不会匹配名为“Jhon S. Pots”的客户)

我还考虑过使用该方法分解 searchQuery Split,但我不知道如何将它与 EF Where 子句正确结合..(我不能使用 foreach 循环并过滤每个字符串,因为它会过滤我的结果通过每个字符串而不是使用OR逻辑运算符)

有谁知道我怎样才能做到这一点?

标签: c#asp.net-coreentity-framework-core

解决方案


要执行类似 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}%");
}

推荐阅读