.NET6 EF CORE实现全局过滤查询

1、设置一个基类(BaseEntity),包含IsDeleted属性

 public class BaseEntity
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public long Id { get; set; } = YitIdHelper.NextId();
        public bool IsDeleted { get; set; } = false;
    }

2、所有用到软删除的类继承于此类,然后在MyDbContext中的OnModelCreating方法中实现全局过滤

 protected override void OnModelCreating(ModelBuilder mb)
  {
            //全局过滤
            foreach (var entityType in mb.Model.GetEntityTypes()
                 .Where(e => typeof(BaseEntity).IsAssignableFrom(e.ClrType)))
            {
                mb.Entity(entityType.ClrType).Property<bool>(nameof(BaseEntity.IsDeleted));//也可以直接填写 "IsDeleted"
                var parameter = Expression.Parameter(entityType.ClrType, "e");
                var body = Expression.Equal(
                    Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, Expression.Constant(nameof(BaseEntity.IsDeleted))),
                    Expression.Constant(false));
                mb.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
            }
  }

 3、使用,无需做任何处理,和平常一样写语句就可以;如果需要查询所有的数据(包含软删除),需要使用 IgnoreQueryFilters()

执行此查询语句,只会查询出isdeleted为0的数据

 var list = await _mathDb.UserGradesAuthorization.Where(x => x.UserAccount == Account).Select(x => new GetGradeInfoProfile
            {
                GradeCode = x.MathGradesId,
                GradeName = x.MathGrades.GradeName
            }).OrderBy(x => x.GradeCode).ToListAsync(); 

忽略过滤查询所有数据使用 IgnoreQueryFilters()

 var list = await _mathDb.UserGradesAuthorization.IgnoreQueryFilters().Where(x => x.UserAccount == Account).Select(x => new GetGradeInfoProfile
            {
                GradeCode = x.MathGradesId,
                GradeName = x.MathGrades.GradeName
            }).OrderBy(x => x.GradeCode).ToListAsync(); 

 

posted @ 2022-10-19 11:05  Haoeaoi  阅读(451)  评论(0编辑  收藏  举报