EF Core комплекс Где - PullRequest
       9

EF Core комплекс Где

0 голосов
/ 08 октября 2018

У меня есть проект MVC, использующий EF Core.В моем контроллере я получаю параметры по 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")

Я также думал о том, чтобы сломать searchQuery с помощью метода Split, но я не знаю, как правильно объединить его с предложением EF Where .. (Я не могу использовать цикл foreach и фильтр для каждой строки, поскольку он будет фильтровать мой результат по каждой строке вместо использования логического оператора OR)

У кого-нибудь есть идеи, как этого добиться?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Чтобы выполнить сравнение со стороной базы данных, вы можете использовать метод EF.Functions.Like () .

Разделить поисковые термины с пробелом в качестве разделителя, выполнить итерации поисковых запросов и добавить гдепредложение к запросу перед выполнением:

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}%");
}
0 голосов
/ 08 октября 2018

Сначала необходимо разбить строку, а затем выполнить запрос на основе соответствия любого из элементов в результирующем массиве каждому полю:

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)));
0 голосов
/ 08 октября 2018

Предполагая, что ваша таблица клиентов имеет уникальный идентификатор.Выполните разделение в строке поиска, и для каждого разделения просто верните список фактических идентификаторов клиентов.Добавьте идентификаторы вместе в список, затем используйте этот список идентификаторов, чтобы получить клиентов, которые соответствуют

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...