有些固定的條件,基本每個查詢的時候需要帶的條件,我們可以使用全局過濾來幫我們,這樣后面的查詢就不用每次都帶條件了。
微軟自帶的: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)); //} } }
在上下文中的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();
........
}