Применение фильтра IgnoreQuery к запросам linq - PullRequest
0 голосов
/ 31 марта 2020

У меня следующий случай. В системе, с которой я работаю, мне пришлось применить концепцию SoftDeleted для сущности Account. Это просто добавление логического флага с именем IsDeleted к сущности Account. В системе мы придерживаемся концепции, что все сущности, которые можно мягко удалить, применили фильтр запроса к полю IsDeleted в DbContext, который также применяется при переносе БД. Определение правила выглядит следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     modelBuilder.Entity<WorkItem>().HasQueryFilter(w => !w.IsDeleted);
     modelBuilder.Entity<Account>().HasQueryFilter(w => !w.IsDeleted);
     ...
}

WorkItem выглядит следующим образом:

public class WorkItem : Entity, ICreationTracked, IModificationTracked
{

     public string Name { get; set; }

     public Guid ModifiedById { get; set; }
     public virtual Account ModifiedBy { get; set; }

     public Guid CreatedById { get; set; }
     public virtual Account CreatedBy { get; set; }
}

Сущность Account:

public class Account : IEntity<Guid>, IDeletionTracked
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public virtual Account DeletedBy { get; set; }
    public Guid? DeletedById { get; set; }
    ...
}

Там может быть случай, когда я запрашиваю некоторые рабочие элементы, и связанный UpdatedBy Account помечается как удаленный. В таком случае я хотел бы иметь возможность установить все поля таких Account как «удаленные».

Для одного случая моей идеей было создать запрос вроде:

var query = Context
            .WorkItems
             .Select(x => new WorkItem()
             {
             Id = x.Id,
             ModifiedBy = Context.Accounts.IgnoreQueryFilters().FirstOrDefault(a => a.Id == x.CreatedById)
             ...
             })
             .AsQueryable()
             .FilterByNameAndDescription(filter);

Затем я смогу l oop через все WorkItems/UpdatedBy (или CreatedBy) и отобразить "Deleted" как Account s Name, Login, et c на основе ModifiedBy.IsDeleted. Это работает нормально для одного случая, однако я обнаружил, что в целом система может удовлетворить десятки запросов, которые потребуют такой модификации. Это потребовало бы огромного количества работы!

Есть ли какой-нибудь умный способ создать что-то вроде SoftDeletedResolver (предположительно на уровне dbContext), который изменит соответствующие поля Account на "удаленные"? Пожалуйста, имейте в виду, что когда я запрашиваю Учетные записи, должен быть применен фильтр удаленного программного обеспечения. Дело только в связанных удаленных аккаунтах. Есть идеи, что я могу сделать? Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...