Использование фильтров Dynami c с Entity Framework Core - PullRequest
2 голосов
/ 10 июля 2020

Я разрабатываю приложение (. Net Core 3.1, C# 8), которое использует Entity Framework Core.

Я хотел бы отфильтровать таблицу с несколькими параметрами фильтрации.

Я получаю условия фильтрации в JSON и десериализую их в объект. Я хочу написать LINQ-запрос where, который будет фильтровать таблицу на основе этих динамических c параметров фильтрации.

Поворот в том, что мне нужно управлять фильтрацией с помощью множества опций и комбинаций.

  • Вы можете отфильтровать market, country, vendor, а остальные параметры фильтра будут null.
  • Вы хотите отфильтровать country и vendor тогда market будет null, а также остальные параметры фильтра.

Я запрашиваю огромную таблицу, поэтому важно написать запрос, который полностью переводится в SQL.

Следующий код работает некорректно. Я ищу нечто подобное, которое может решить эту проблему:

var filters = new demoFilterEntity()
{
      Market = new List<string>() { "LAT", "NAM" }
};

var filteredData = demoMainRepository.GetAll().Where(x =>
      x.Market != null && (filters.Market != null ? filters.Market.Contains(x.Market) : false) &&
      x.Country != null && (filters.Country != null ? filters.Country.Contains(x.Market) : false)).ToList();

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

1 Ответ

2 голосов
/ 10 июля 2020

Если у вас есть только AND условия, вы можете сделать это просто с помощью цепочки Where предложений:

var query = demoMainRepository.GetAll().Where(x => x.Market != null); 
if(filters.Market != null)
{
    query = query.Where(x => filters.Market.Contains(x.Market));
}
...
var filteredData = query.ToList();

Также, как сказал @ Lajos Arpad , возможно, вам нужно подумать об объединении проверки полей null (т.е. x.Market != null) с проверками фильтров:

var query = demoMainRepository.GetAll(); 
if(filters.Market != null)
{
    query = query.Where(x =>  x.Market != null && filters.Market.Contains(x.Market));
}
...
var filteredData = query.ToList();
...