tentrun
@tentrun
Fullstack (asp.net /react, vue, angular) deletant

Как получить список с фильтрами?

Задача : Получить список с фильтрами (если заданы)
Как сказали модель объекта будет приходить с фронта в get запросе
На проекте 3tier архитектура.

Есть в репозитории метод который возвращает по придикату то, что нужно, т.е. список
Код метода с репозитория
public async Task<List<T>> GetWithPredicate(Expression<Func<T, bool>>? predicate = null,
            Func<IQueryable<T>, IOrderedQueryable<T>>? order = null,
            Func<IQueryable<T>, IIncludableQueryable<T, object>>? include = null,
            CancellationToken cancellationToken = default)
        {
            IQueryable<T> query = _dbSet;

            if (include != null)
            {
                query = include(query);
            }

            if (predicate != null)
            {
                query = query.Where(predicate);
            }

            if (order != null)
            {
                return await order(query).ToListAsync(cancellationToken: cancellationToken);
            }
            else
            {
                return await query.ToListAsync(cancellationToken: cancellationToken);
            }
        }

Окей, засовываем предикат и будет радость.

Но каким образом его в сервисе сформировать, ровно как и include и order?
Если придет модель с 1 заполненным полем (условным Name), а остальные пустые, предикат будет сверять нулл и в итоге ничего не отдаст с запроса

Общая логика такова GET запрос на котроллер который принимает модель => котроллер вызывает метод сервиса и отдает модель в аргументы => ??? => идет вызов метода репозитория с указанными аргументами
Как сформировать пропущенное звено?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
@OwDafuq
1) Отдавать из репозитория IQueryable и в контроллере/другом слое приложения конструировать запрос исходя из того, что пришло с фронта, как вариант.
2) Specification pattern

2 варианта на выбор
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@forced
Odata?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы