包含集合时激活 SoftDelete 数据过滤器

Activate SoftDelete data filter when including collections

有没有办法在使用 GetAllIncludingInclude 方法时自动激活 "IsSoftDelete" EF Core 过滤器?

public override Task<PublicationDto> Get(EntityDto<Guid> input)
{
    var entity = Repository
                .GetAllIncluding(x => x.SocialPosts)
                .FirstOrDefault(x => x.Id == input.Id);
     return Task.FromResult(entity.MapTo<PublicationDto>());
}

A​​BP 的 EFCore 版本不会自动过滤除查询的根实体以外的任何内容。如果您查看 AbpRepositoryBase 中的实现,ApplyFilters 只会查看查询所基于的实体,而不是任何包含的内容。

if (typeof(ISoftDelete).GetTypeInfo().IsAssignableFrom(typeof(TEntity)))
{
    if (UnitOfWorkManager?.Current == null || UnitOfWorkManager.Current.IsFilterEnabled(AbpDataFilters.SoftDelete))
    {
        query = query.Where(e => !((ISoftDelete)e).IsDeleted);
    }
}

在 EF 的常规实现中(使用 EF v6.x),他们使用 DynamicFilters nuget 包来为他们处理这个问题,但 EF Core 不存在该插件。这确实是 EF Core 的局限性,比 ABP 更甚。 EF Core 没有可用于修改从 Include 生成的查询的挂钩,至少我正在阅读的是这样。

因此,这意味着您将需要执行自己的查询来解决此问题。您可以在以下 link:

中了解如何通过使用投影来过滤包含

Filtering include items in LINQ and Entity Framework

您可以使用我对 EF Core 1.x 软删除使用的技巧,或使用 EF core 2

How can I implement "Soft Deletes" with "Entity Framework Core" (aka EF7)?

它将在包含期间过滤实体

我是 late.But 现在有一个叫做 "QueryFilter" 的。 详情:

https://docs.microsoft.com/en-us/ef/core/querying/filters

https://www.meziantou.net/entity-framework-core-soft-delete-using-query-filters.htm

https://spin.atomicobject.com/2019/01/29/entity-framework-core-soft-delete/

MyModel 将被过滤,即使它是一个包含的对象

    builder.Entity<MyModel>().HasQueryFilter(m => EF.Property<bool>(m, "isDeleted") == false);