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 = ;
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(); ........
}
ef core 全局过滤的更多相关文章
- EF Core 数据过滤
1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...
- 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询
前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...
- EntityFramework Core 2.0全局过滤(HasQueryFilter)
前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求.在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilte ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- EF Core 2.0 新特性
前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...
- asp.net core 排序过滤分页组件:sieve(1)
使用asp.net core开发时避免不了要用一个合适的分页组件来让前端获取分页数据.github上面有一个开源的分页组件在这方面很适合我的使用,于是我把他的文档翻译一下,随后会分析它里面的源码.这是 ...
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- DDD Code First 迁移数据实现EF CORE的软删除,值对象迁移配置
感谢Jeffcky大佬的博客: EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p ...
- EF Core 实现多租户
目录 SAAS 和多租户 多租户数据隔离方案 使用 EF Core 简单实现多租户 单数据库实现 多数据库实现 源代码 参考 SAAS 和多租户 SaaS(软件及服务)区别于其他应用程序的主要特征就是 ...
随机推荐
- 双栈(Dual Stack)
参考博客: 双栈数据结构: https://blog.csdn.net/hebtu666/article/details/83011115 https://blog.csdn.net/cainv89/ ...
- java--static与代码块
static与代码块: static class Student{ static String school; // 随着类的加载而执行 可以由类进行调用 static { // 静态代码块 加载类时 ...
- sqlalchemy相关操作(ORM)
环境:python3.7,pycharm,mysql ORM(Object-Relational-Mapper) 对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术,sq ...
- Mysql高性能优化规范
数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意 ...
- mysql中的where和having的区别
下面以一个例子来具体的讲解: 1. where和having都可以使用的场景 1)select addtime,name from dw_users where addtime> 1500000 ...
- python数据类型之二
列表 list #定义:[]内可以有多个任意类型的值,逗号分隔 基本语法 # 定义:[]内可以有多个任意类型的值,逗号分隔 # my_girl_friends=['alex','wupeiqi','y ...
- Nat类型测试
这是一个测试NAT类型的小工具,一般也没太多用处,只有游戏玩家可能需要用来测试你的网络NAT类型是什么.NAT类型一般分为以下4种: 1. Full Cone NAT (完全圆锥型)2. Restri ...
- pydev离线安装及安装后eclipse中不显示解决办法
eclipse插件安装方法(离线安装)pydev进入eclipse目录1.创建links目录2.复制压缩包到目录前解压3.在links目录下新建pydev.link文件(记事本修改后缀名即可)4.py ...
- .Net反射-TypeDescriptor
.Net中提供了两种方式访问类型的元数据:System.Reflection命名空间中提供的反射API和TypeDescriptor类.反射适用于所有类型的常规机制,它为类型返回的信息是不可扩展的,因 ...
- Spring Cloud微服务安全实战_3-3_API安全之流控
这几篇将API安全的 流控.认证.审计.授权 简单的过一遍,对这些概念先有个初步印象.后边还会详细讲解. 本篇说API安全之流控~第一印象. 一.概念 流控,流量控制,只放系统能处理的请求的数量过去, ...