zoukankan      html  css  js  c++  java
  • ef core 全局过滤

     有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了。

    微软自带的:https://docs.microsoft.com/zh-cn/ef/core/querying/filters 

    特殊针对的过滤:https://entityframework-plus.net/query-filter

    准备:

    nuget    Z.EntityFramework.Plus.EFCore

    例子:

    现在我的表中有4条数据,两条是不需要的,需要过滤这两条数据

    我们过滤掉IsDeleted=1的数据

    ① 创建过滤配置文件  DbFilterConfiguration.cs

    添加方法

      /// <summary>
            /// 初始化全局的过滤,如软自带的
            /// </summary>
            /// <param name="entityType">过滤</param>
            /// <param name="modelBuilder">builder</param>
            public static void InitGobalFilter(IMutableEntityType entityType, ModelBuilder modelBuilder)
            {
                if (modelBuilder == null)
                {
                    return;
                }
                IEnumerable<IMutableProperty> props = entityType.GetProperties();
                if (props.Any(x => x.Name == "IsDeleted"))
                {
                    ParameterExpression parameter = Expression.Parameter(entityType.ClrType, "e");
                    byte defaultValue = 0;
                    BinaryExpression body = Expression.Equal(
                        Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(byte) }, parameter, Expression.Constant("IsDeleted")),
                   Expression.Constant(defaultValue));
                    modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                    //if (entityType.Name.ToLower().Contains("view"))
                    //{
                    //    modelBuilder.Query(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                    //}
                    //else
                    //{
                    //modelBuilder.Entity(entityType.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
                    //}
                }
            }
    View Code

    在上下文中的OnModelCreating方法添加代码

      protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                IEnumerable<Microsoft.EntityFrameworkCore.Metadata.IMutableEntityType> entityTypes = modelBuilder.Model.GetEntityTypes();
                foreach (Microsoft.EntityFrameworkCore.Metadata.IMutableEntityType entityType in entityTypes)
                {
                    DbFilterConfiguration.InitGobalFilter(entityType, modelBuilder);
                }
            }

    这样我们每次查询的时候都会把IsDeleted=1的数据过滤

    ②使用Z.EntityFramework.Plus.EFCore 针对表,视图强过滤

    在DbFilterConfiguration.cs中加如下代码

     /// <summary>
            /// 正针对表进行过滤
            /// </summary>
            /// <param name="db"></param>
            public static void InitContextFilter(MyDbContext db)
            {
                //根据登入人,针对某些表进行过滤
                //db.Filter<ViewPFUser>(q => q.Where(x => x.IsDeleted == 0));
                //db.ViewPFUser.AsNoFilter() 取消过滤
                db.Filter<ViewPFUser>(q => q.Where(x => x.UserName == "admin"));
            }

    效果:

      /// <summary>
            /// 测试EFCore
            /// </summary>
            /// <returns></returns>
            [AllowAnonymous]
            [HttpGet("Test")]
            public async Task<IActionResult> Test()
            {
                //admin,admin22
                List<PFUser> list2 = await _db.PFUser.AsNoTracking().ToListAsync();
            //admin,admin22.admin44,admin456 取消过滤 List
    <PFUser> list4 = await _db.PFUser.AsNoTracking().IgnoreQueryFilters().ToListAsync(); //admin List<ViewPFUser> list3 = await _db.ViewPFUser.AsNoTracking().ToListAsync(); //admin,admin22 取消针对性的过滤 List<ViewPFUser> list5 = await _db.ViewPFUser.AsNoFilter().ToListAsync();

           ........
    }
  • 相关阅读:
    C#(64位系统) 解决"未能加载文件或程序集,或它的某一个依赖项..."
    C#匿名方法与Delegate类型转换错误
    记录C#错误日志工具
    C# 引用访问权限,很多老手都不懂
    .NET基础之自定义泛型
    C# Socket学习笔记一
    .Net垃圾收集机制—了解算法与代龄
    审计系统---堡垒机项目之环境准备
    审计系统---堡垒机项目之表结构设计
    审计系统---堡垒机python下ssh的使用
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/11247232.html
Copyright © 2011-2022 走看看