[英]EF Core complex Where
我有一個使用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
和lastName
,但是必須完全匹配(IE不會匹配名為“ Jhon S. Pots”的客戶)
我還考慮過使用Split
方法分解searchQuery,但是我不知道如何正確地將它與EF Where子句結合起來。.(我無法對每個字符串使用foreach循環和過濾器,因為它將過濾我的字符串每個字符串的結果,而不是使用OR
邏輯運算符)
有人知道我該如何實現嗎?
假設您的客戶表具有唯一的ID。 對搜索字符串執行拆分,然后為每個拆分僅返回實際客戶ID的列表。 將ID一起添加到列表中,然后使用該ID列表獲取匹配的客戶
要執行數據庫方面的比較,您可以使用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}%");
}
您需要先分割字符串,然后根據結果數組中的任何項目是否與每個字段匹配來進行查詢:
var keywords = searchQuery.Split(' ');
然后:
collectionBeforePaging = _context.Customers
.Where(a => a.Employer == null
? keywords.Any(k =>
a.Person.FirstName.Contains(k) ||
a.Person.LastName.Contains(k) ||
a.PersonId.ToString().Contains(k))
: keywords.Any(k =>
a.Employer.Name.Contains(k) ||
a.EmployerId.ToString().Contains(k)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.