Фильтровать по Include() в EF

Есть ли способ фильтровать на основе свойства в EF?

public async Task<Challenge?> GetByIdAsync(int id)
{
    var item = await _context.Challenges
    .Include(x => x.Upload) // Where Upload.DeletedOn == null Else null
    .FirstOrDefaultAsync(x => x.Id == id && x.DeletedOn == null);
    return item;
}

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

Пытался пройти через это, но это не в отношении один-к-одному - фильтруется-включается

Вы не хотите загружать свойство Upload, если оно удалено? Я прав?

Svyatoslav Danyliv 13.08.2024 13:24

Да, именно если DeletedOn НЕ NULL, не загружайте его. В моем приложении => DeletedOn == null означает НЕ удаленный, а DeletedOn != null означает удаление в эту дату (мягкое удаление)

Moasfar Javed 13.08.2024 13:43

Фильтрованное включение предназначено не только для отношений «один к одному». Но да, его нельзя использовать для отношений x-1.

Gert Arnold 13.08.2024 18:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это двумя способами:

Использование Глобальных фильтров запросов:

Определите фильтр для обоих объектов следующим образом:

modelBuilder.Entity<Challenge>().HasQueryFilter(x => x.DeletedOn == null);
modelBuilder.Entity<Upload>().HasQueryFilter(x => x.DeletedOn == null);

Если ваши сущности реализуют интерфейс или наследуют от базового класса, вы можете применить фильтр запроса ко всем из них, используя простой метод расширения, например этот: ApplyQueryFilter.

modelBuilder.ApplyQueryFilter<ISoftDelete>(e => e.DeletedOn == null);

Тогда ваш запрос будет простым:

public async Task<Challenge?> GetByIdAsync(int id)
{
    var item = await _context.Challenges
        .Include(x => x.Upload) 
        .FirstOrDefaultAsync(x => x.Id == id);
    return item;
}

Используя Select:

public async Task<Challenge?> GetByIdAsync(int id)
{
    var item = await _context.Challenges
        .Where(x => x.Id == id && x.DeletedOn == null)
        .Select(x => new Challenge
        {
            Id = x.Id,
            // other properties
            Upload = x.Upload.DeletedOn == null ? x.Upload : null
        })
        .FirstOrDefaultAsync();
    return item;
}

Другие вопросы по теме