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(软件及服务)区别于其他应用程序的主要特征就是 ...
随机推荐
- 用jquery写自己的form表单验证
这几天看了锋利的jquery,感觉很不错.特别是jquery强大的选择器.今天就利用jquery写了一个自己的form表单验证的小案例.当巩固下jquery.首先贴下代码,当然只是一个小案例. 思路: ...
- 【JZOJ】1341. water(水流)
题目大意 你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,小镇可以认为是N * M的矩阵.矩阵里的每个单元格都是一个‘a’- ‘z’小写字母,该小写字母表示该格子的高 ...
- MySQL语言分类——DML
DML DML的全称是Database management Language,数据库管理语言.主要包括以下操作: insert.delete.update.optimize. 本篇对其逐一介绍 IN ...
- 【开发笔记】- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换
AbstractRoutingDataSource动态数据源切换 上周末,室友通宵达旦的敲代码处理他的多数据源的问题,搞的非常的紧张,也和我聊了聊天,大概的了解了他的业务的需求.一般的情况下我们都是使 ...
- 【转载】C#使用typeof运算符获取对象变量的具体类型Type
在C#的实际类型操作过程中,有时候需要通过typeof方法获取对象的类型对应的Type变量即具体类型,例如在获取DataTable中某一列的具体数据类型的时候,我们就会用到typeof方法来获取具体的 ...
- Qt选择文件路径
QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./"); ...
- Git的下载安装
下载地址:https://git-scm.com/download/win 命令: git add ... ---将资源放到缓存区域 git commit -m "提交说明" ...
- Oracle PLSQL游标、游标变量的使用
参考文章:https://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实 ...
- linux中find命令的使用详解(转载)
常用命令 find (目录) [-type d | f] (文件夹 | 文件) -name (名称,可使用正则表达式) find /root -name "*core&q ...
- docker上启动mysql镜像,mysq中记录乱码解决方法
在docker上启动一个mysql, 1. docker pull mysql 2. docker run --name mysql_dev -p 3306:3306 -e MYSQL_ROOT_PA ...