EF Core全局查询筛选器怎么用 EF Core Global Query Filters教程


EF Core全局查询筛选器是自动添加WHERE条件的机制,支持软删除(如!IsDeleted)、多租户隔离(如TenantId匹配)及复合条件(如!IsDeleted && IsActive),通过HasQueryFilter配置,IgnoreQueryFilters可临时绕过。

EF Core全局查询筛选器(Global Query Filters)是一次配置、处处生效的自动过滤机制,不用每次写.Where(x => x.IsDeleted == false).Where(x => x.TenantId == current),系统会在生成SQL时自动加上。

软删除场景:自动过滤已标记删除的数据

适合需要保留历史记录、支持数据恢复的业务,比如文章、订单、用户资料等。

  • 实体中加一个bool IsDeleted字段
  • OnModelCreating里配置:
    modelBuilder.Entity().HasQueryFilter(a => !a.IsDeleted);
  • 之后所有ctx.Articles.ToList()ctx.Articles.First()等查询,SQL都会自动带WHERE IsDeleted = 0
  • 如需查已被软删除的数据,用ctx.Articles.IgnoreQueryFilters().Where(a => a.IsDeleted)

多租户隔离:按租户ID自动过滤

每个租户看到的数据必须严格隔离,不能靠开发人员手动加条件,容易遗漏。

  • 实体中添加string TenantId字段(建议非空、索引)
  • DbContext中注入IHttpContextAccessor,获取当前请求的租户标识(可来自JWT、Header、子域名等)
  • 配置过滤器:
    modelBuilder.Entity().HasQueryFilter(p => p.TenantId == _tenantId);
    其中_tenantIdDbContext构造函数注入并缓存的值
  • 注意为TenantId字段建立数据库索引,否则性能会明显下降

复合条件与导航属性联动

一个筛选器可以包含多个逻辑,还能跨关联实体生效。

  • 例如同时满足软删除 + 状态启用:
    p => !p.IsDeleted && p.IsActive
  • 支持引用导航属性,比如只查“所属博客未被删除”的文章:
    a => !a.Blog.IsDeleted && !a.IsDeleted
  • 此时EF Core会自动把Blog上的过滤器也带上,形成递归过滤
  • 注意:同一实体只能有一个全局筛选器,多个HasQueryFilter调用会覆盖,要用&&合并条件

绕过筛选器的正确方式

某些管理后台或迁移脚本需要查看全部数据,包括被过滤掉的。

  • IgnoreQueryFilters()临时关闭当前查询的全局过滤:
    ctx.Users.IgnoreQueryFilters().ToList()
  • 它只影响本次LINQ链,不影响后续其他查询
  • 不要滥用——比如在普通API里用它查全部用户,可能造成越权访问
  • 若需部分跳过(如只跳过租户过滤但保留软删除),目前EF Core不原生支持,得拆成两个DbContext或用原始SQL

基本上就这些。配置简单,效果直接,关键是能从框架层守住数据边界,避免人为疏漏。


# access  # 数据恢复  # sql  # String  # 构造函数  # 递归  # bool  # 数据库  # linq  # 多个  # 跳过  # 还能  # 已被  # 会在  # 要用  # 历史记录  # 如需  # 用它 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何使用Golang处理静态文件缓存_提高页面加载速度  Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】  如何减少Golang内存碎片化_Golang内存分配与回收优化方法  Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】  Win11快速助手怎么用_Win11远程协助连接教程【工具】  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何在 Django 中安全修改用户密码而不使会话失效  如何在 Go 后端安全获取并验证前端存储的 JWT?  Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠  如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题  Windows服务持续崩溃怎样修复_系统服务保护机制解析  Python类装饰器使用_元编程解析【教程】  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  如何在JavaScript中动态拼接PHP的base_url与JS变量  php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】  c++中的std::conjunction和std::disjunction是什么_c++模板元编程逻辑运算【C++17】  php本地部署支持nodejs吗_php与nodejs混合开发环境搭建教程【教程】  C++中引用和指针有什么区别?(代码说明)  Win11局域网共享怎么设置 Win11文件夹网络共享教程【详解】  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  Python异步网络编程_aiohttp说明【指导】  Python变量绑定机制_引用模型解析【教程】  c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)  php下载安装后memory_limit怎么设置_内存限制调整【技巧】  微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】  Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  Win10系统字体模糊怎么办_Windows10高级缩放设置修复  Win10如何关闭安全中心所有通知 Win10禁用Windows Defender提醒【设置】  c# 在ASP.NET Core中管理和取消后台任务  如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】  Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解  Python抽象类与接口设计_规范说明【指导】  Win11怎么开启空间音效_Windows11耳机杜比音效与Sonic设置  C#怎么创建控制台应用 C# Console App项目创建方法  Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】  Win11任务栏天气怎么关闭 Win11隐藏天气小组件图标【设置】  如何在 Go 同包不同文件中正确引用结构体  Python字符串操作教程_切片拼接与格式化详解  如何使用Golang反射创建map对象_动态生成键值映射  Django 密码修改后会话失效的解决方案  Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】  Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】  php485返回空数组怎么回事_php485数据接收为空排查指南【详解】  Go语言中slice追加操作的底层共享机制详解  Windows10怎么卸载预装软件_Windows10预装软件卸载步骤【教程】 

 2025-12-23

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.