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(软件及服务)区别于其他应用程序的主要特征就是 ...
随机推荐
- Java Automic包下的AtomicInteger
感谢这两位博主的文章,文章源于: https://www.cnblogs.com/chenpi/p/5375805.html https://blog.csdn.net/fanrenxiang/art ...
- Filco圣手二代双模蓝牙机械键盘的连接方法
常规方法 确认键盘的电源接通. 同时按下「Ctrl」+「Alt」+「Fn」执行装置切换模式.配对LED灯(蓝)和低电量显示LED灯(红)约同时亮10秒左右. 想移除已登录的装置时,请从「蓝牙装置登录/ ...
- tensorflow常用函数(二)
一.变量相关的函数 1)tf.train.list_variables(ckpt_dir_or_file) Returns list of all variables in the checkp ...
- JavaScript 究竟是怎样执行的?
摘要: 理解 JS 引擎运行原理. 作者:前端小智 原文:搞懂 JavaScript 引擎运行原理 Fundebug经授权转载,版权归原作者所有. 一些名词 JS 引擎 - 一个读取代码并运行的引擎, ...
- vue 利用路由跨页传参
第一页,点击进入第二页进行传值: <template> <div id="app"> <div><router-link to=" ...
- Solr搜索器的特性及相关操作
一.搜索处理器简介 所有的请求处理器都实现一个Java类,本例实现了solr.SearchHandler.在运行时,solr.SearchHandler被解析为内置的Solr类org.apache.s ...
- linux 下按照文件名模糊查找文件
fnmatch int fnmatch(const char *pattern, const char *string, int flags); 参数说明 FNM_NOESCAPE 如果这个标志设置了 ...
- angular6 使用daterangepicker的注意事项
具体使用方法可参考这篇博客:https://blog.csdn.net/qq_43225030/article/details/84973086 需要注意的地方是,在dateRangePicker函数 ...
- Linux shell while循环语句
for :明确循环次数 while :不确定循环换次数 while循环 (1) while CONDITION:do statement statement < ...
- Linux(Centos7.6)下安装Gitlab详细教程
Gitlab搭建操作步骤: 1.查看Linux系统版本确认gitlab需要使用的安装包类型 使用命令:cat /etc/redhat-release CentOS Linux release 7.6. ...