MVC5中Operation模型查询时自动过滤IsHidden=False记录的实现方法
你需要的是针对Operation实体的全局查询过滤能力,无需在每次查询时手动编写Where子句即可自动过滤IsHidden = false的记录,构造函数、实体属性的getter/setter无法实现该需求(这类逻辑仅在实体实例化后生效,会先全量查询数据再过滤,性能极低),推荐使用Entity Framework提供的全局查询过滤器实现,具体方案如下:
方案1:EF 6.1+ 原生全局查询过滤器(推荐)
MVC 5配套的Entity Framework 6.1及以上版本原生支持全局查询过滤功能,只需修改ApplicationDbContext的配置即可:
- 打开你的
ApplicationDbContext类,重写OnModelCreating方法,添加如下配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 为Operation实体添加全局过滤规则,所有查询默认仅返回IsHidden为false的记录 modelBuilder.Entity<Operation>() .HasQueryFilter(o => !o.IsHidden); }
配置完成后,你原本的查询代码不需要做任何修改:
var db = new ApplicationDbContext(); // 自动添加IsHidden=false的查询条件,返回所有未隐藏的Operation记录 var operations = db.Operations.ToList();
如果特殊场景需要查询包含已隐藏的全量记录,可以调用IgnoreQueryFilters方法临时关闭过滤:
var allOperations = db.Operations.IgnoreQueryFilters().ToList();
该方案的过滤逻辑会直接拼接成SQL条件执行在数据库层面,性能无损耗,且关联查询引用Operation实体时也会自动生效。
方案2:低版本EF 封装DbSet实现
如果你使用的EF版本低于6.1,不支持原生全局过滤器,可以通过封装DbSet属性实现需求:
修改ApplicationDbContext中的Operations属性定义:
// 原有DbSet改为私有内部属性 private DbSet<Operation> OperationsInternal { get; set; } // 对外公开的Operations属性默认返回过滤后的IQueryable public IQueryable<Operation> Operations { get { return OperationsInternal.Where(o => !o.IsHidden); } }
该方案仅在直接调用db.Operations时生效,关联查询场景不会自动应用过滤规则,仅作为低版本EF的兼容方案使用。
内容的提问来源于stack exchange,提问作者HamXa Khalid
相关产品推荐
相关产品推荐

