簡體   English   中英

EF核心綜合體

[英]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”和姓氏“點”。

我可以連接firstNamelastName ,但是必須完全匹配(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM