EF Core:仅忽略顶层实体查询过滤器,保留关联实体过滤
解决EF Core中仅忽略顶层实体软删除查询过滤器的问题
你遇到的问题核心是IgnoreQueryFilters()会全局作用于整个查询,调用后所有关联实体的软删除过滤器都会被忽略,导致返回已删除的子实体。以下是几种可行的解决方法:
方法一:直接在顶层实体查询中覆盖过滤条件(推荐)
不需要调用IgnoreQueryFilters(),直接在查询中显式指定顶层实体的软删除条件,这样关联实体的过滤器依然生效,不会返回已删除的子项:
// 查询所有顶层实体(包含已删除的),关联实体仅返回未删除的 var allTopEntities = await DbContext.MyEntries .Where(e => EF.Property<DateTime?>(e, "DateDeleted").HasValue || !EF.Property<DateTime?>(e, "DateDeleted").HasValue) .Include(e => e.ChildEntities) .ToListAsync(); // 如果只需要已删除的顶层实体: var deletedTopEntities = await DbContext.MyEntries .Where(e => EF.Property<DateTime?>(e, "DateDeleted").HasValue) .Include(e => e.ChildEntities) .ToListAsync();
方法二:拆分查询+手动加载关联实体
先单独查询忽略过滤器的顶层实体,再手动加载关联实体(此时关联实体使用默认过滤器,只返回未删除项):
// 第一步:获取包含已删除的顶层实体 var topEntities = await DbContext.MyEntries .IgnoreQueryFilters() .ToListAsync(); // 第二步:手动加载每个顶层实体的关联项,默认过滤器生效 foreach (var entity in topEntities) { // 集合类型关联(比如一对多) await DbContext.Entry(entity) .Collection(e => e.ChildEntities) .LoadAsync(); // 引用类型关联(比如一对一) // await DbContext.Entry(entity) // .Reference(e => e.RelatedEntity) // .LoadAsync(); }
方法三:使用投影显式过滤关联实体
通过投影查询,在获取顶层实体的同时,显式过滤关联实体,确保只返回未删除的子项:
var result = await DbContext.MyEntries .IgnoreQueryFilters() .Select(e => new { TopEntity = e, // 显式过滤关联实体,仅保留未删除的 ValidChildEntities = e.ChildEntities.Where(c => !EF.Property<DateTime?>(c, "DateDeleted").HasValue) }) .ToListAsync(); // 如果需要将子实体赋值回原对象,可以后续处理: foreach (var item in result) { item.TopEntity.ChildEntities = item.ValidChildEntities.ToList(); }
内容的提问来源于stack exchange,提问作者E4est
相关产品推荐
相关产品推荐

