Фильтрация общего выбора с изменяемыми параметрами - PullRequest
0 голосов
/ 12 сентября 2018

Я сделаю это просто.У меня есть конечная точка API, которая получает от 0 до 3 параметров.Метод get выглядит следующим образом:

[HttpGet("filtrar")]
public ActionResult<List<TipoDocumento>> GetAllPorFiltro(string sigla, int? status, string descricao)
{
    return _tipoDocumentoRepositorio.GetAllByFilter(????);
}

_tipoDocumentoRepositorio - это интерфейс с DI, а метод GetAllByFilter () в реализующем его классе выглядит следующим образом:

public List<T> GetAllByFilter(Expression<Func<T, bool>> filter)
{
    return _someContexto.Set<T>()
        .Where(filter)
        .ToList();
}

Дело в том: хотя я поставил функцию на ????(как

f => f.Sigla.Equals(sigla)

), это заставляет меня возвращать пустой список.Что я делаю неправильно?Или что еще я должен сделать, чтобы заставить его работать?

Obs: Я не могу поместить весь код здесь, потому что он не мой, но я могу поспорить.Чтобы быть уверенным: я использую EF (и Миграция и сортировка, я новичок в C #).И любые ссылки на другие вопросы, которые могут ответить на мой вопрос, также приветствуются.Заранее спасибо.

1 Ответ

0 голосов
/ 12 сентября 2018

Измените GetAllByFilter на GetAll() и верните IQueriable<T>

Создать метод расширения:

public static IQueryable<T> WhereIf<T>(
   this IQueryable<T> source, bool condition, 
   Expression<Func<T, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

Используйте это так:

[HttpGet("filtrar")]
public ActionResult<List<TipoDocumento>> GetAllPorFiltro(string sigla, int? status, string descricao)
{
     var res = _tipoDocumentoRepositorio
        .GetAll()
        .WhereIf(!String.IsNullOrEmpty(sigla), q => q.sigla == sigla)
        .WhereIf(status.HasValue, q => q.sigla == sigla.Value)
        .WhereIf(!String.IsNullOrEmpty(descricao), q => q.descricao == descricao)
        .ToList();
     ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...