使用 IgnoreQueryFilters() 可临时绕过 EF Core 全局查询过滤器,如获取软删除数据,仅作用于当前查询,常用于管理功能或数据迁移,需谨慎避免数据泄露。

在 C# 使用 EF Core 时,查询过滤器(通过 HasQueryFilter 配置)会自动应用于所有相关实体的查询。但有时你需要临时忽略这些过滤器,比如在管理功能或数据迁移中获取“被软删除”或特定状态的数据。
EF Core 提供了两种主要方式来临时绕过查询过滤器:
1. 使用 IgnoreQueryFilters() 方法
这是最常用的方式。调用 IgnoreQueryFilters() 可以临时禁用当前查询上配置的所有全局查询过滤器。
示例:
假设你有一个 User 实体,并在 DbContext 中设置了软删除过滤器:
// 在 DbContext 的 OnModelCreating 中 modelBuilder.Entity() .HasQueryFilter(u => !u.IsDeleted);
正常查询只会返回未删除的用户:
```csharp var activeUsers = context.Users.ToList(); // 只返回 IsDeleted == false 的用户 ```如果你想获取所有用户(包括已软删除的),可以这样写:
```csharp var allUsers = context.Users.IgnoreQueryFilters().ToList(); ```注意:这个方法只影响当前查询,不会改变其他查询的行为,非常安全。
2. 使用 AsNoTrackingWithIdentityResolution 或原始 SQL(间接方式)
虽然不能直接通过原始 SQL 绕过查询过滤器(因为过滤器仍会被合并),但你可以结合 FromSqlRaw 和 IgnoreQueryFilters 来实现更复杂的场景:
var usersFromSql = context.Users
.IgnoreQueryFilters()
.FromSqlRaw("SELECT * FROM Users")
.ToList();这在需要执行自定义 SQL 但又想跳过过滤器时很有用。
使用场景建议
- 管理后台查看所有记录(包括软删除)
- 数据修复脚本
- 报表生成需要完整数据集
- 单元测试中验证底层数据状态
重要提醒:谨慎使用 IgnoreQueryFilters(),尤其是在用户可触发的请求中,避免暴露不应访问的数据(如已删除或私密记录)。建议配合权限校验使用。
基本上就这些。只要记得在需要时加上 .IgnoreQueryFilters(),就能轻松绕过全局过滤规则。不复杂但容易忽略。










