EF Core 2.0 поиск нескольких столбцов с фильтром содержит - PullRequest
0 голосов
/ 26 апреля 2018

Предположим, сущность, Patient существует в контексте, который был создан с использованием подхода, основанного на базе данных, поэтому я не могу изменить базу данных.

public class Patient
{
   public string Id { get; set; }
   public string Surname { get; set; }
   public string Forename { get; set; }
}

Я бы хотел отфильтровать пациентов по имени, например, имя или фамилия или полное имя. В настоящее время у меня есть следующий запрос:

await query
         .Where(p => p.Forename != null && p.Forename.ToLower().Contains(filter) ||
                     p.Surname != null && p.Surname.ToLower().Contains(filter))
         .ToListAsync();

Это, очевидно, проверяет только столбцы имени / фамилии индивидуально. Если фильтр имеет полное имя, он не работает.

Я попытался выполнить интерполяцию строк в предложении where, чтобы применить фильтр содержимого для комбинации имени и фамилии, но он не поддерживается в ядре ef и выполняется локально. Поскольку в базе данных содержится более миллиона пациентов, выполнение запроса локально в приложении не является опцией и должно выполняться в базе данных (поиск занимает более минуты).

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 26 апреля 2018

Интерполяция не может быть переведена EF.

Просто используйте оператор «+» для объединения строк, как показано ниже:

await query
     .Where(p => p.Forename.ToLower().Contains(filter) ||
                 p.Surname.ToLower().Contains(filter)) || 
                 (p.Forename + " " + p.Surname).ToLower().Contains(filter))
     .ToListAsync();
...