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();

       ........
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM