如何在EF6中实现EF Core的IgnoreQueryFilter()功能?
EF 6中选择性绕过软删除全局过滤器的方案
你用的modelBuilder.Filter("IsDeleted", (Projects p) => p.IsDeleted, false)是基于EntityFramework.Filters第三方库实现的全局过滤,下面是几种绕过该过滤器的可行方案:
方案1:临时禁用指定过滤器
利用库自带的DisableFilter方法,在需要查询软删除数据时临时关闭过滤器,操作完成后可选择恢复,避免影响后续查询:
using (var context = new ApplicationDbContext()) { // 关闭IsDeleted全局过滤器 context.DisableFilter("IsDeleted"); // 查询所有项目(包含已软删除的) var allProjects = context.Projects.ToList(); // 恢复过滤器(可选,确保后续查询自动应用过滤规则) context.EnableFilter("IsDeleted"); }
方案2:直接执行原生SQL查询
通过原生SQL绕过EF的查询过滤器,直接从数据库获取所有数据:
using (var context = new ApplicationDbContext()) { // 方式1:通过DbSet执行SQL var allProjects = context.Projects.SqlQuery("SELECT * FROM Projects").ToList(); // 方式2:通过Database对象执行SQL(适用于复杂查询) var allProjects = context.Database.SqlQuery<Project>("SELECT * FROM Projects").ToList(); }
方案3:创建无过滤的DbContext实例
如果需要频繁查询无过滤数据,可以新建一个继承自原有上下文的类,移除或不添加IsDeleted过滤器:
public class UnfilteredAppDbContext : ApplicationDbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 移除已配置的IsDeleted过滤器 modelBuilder.RemoveFilter("IsDeleted"); } } // 使用示例 using (var context = new UnfilteredAppDbContext()) { var allProjects = context.Projects.ToList(); }
各方案对比
- 方案1:灵活可控,适合单次临时查询,不会污染上下文配置
- 方案2:无需修改上下文,适合简单查询,但SQL语句硬编码维护性较差
- 方案3:适合频繁的无过滤查询场景,上下文职责清晰
内容的提问来源于stack exchange,提问作者user2903753
相关产品推荐
相关产品推荐

