有些固定的条件,基本每个查询的时候需要带的条件,我们可以使用全局过滤来帮我们,这样后面的查询就不用每次都带条件了。

微软自带的: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 全局过滤的更多相关文章

  1. EF Core 数据过滤

    1 前言 本文致力于将一种动态数据过滤的方案描述出来(基于 EF Core 官方的数据筛选器),实现自动注册,多个条件过滤,单条件禁用(实际上是参考ABP的源码),并尽量让代码保持 EF Core 的 ...

  2. 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询

    前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...

  3. EntityFramework Core 2.0全局过滤(HasQueryFilter)

    前言 EntityFramework Core每一次版本的迭代和更新都会带给我们惊喜,每次都会尽量满足大部分使用者的需求.在EF Core 2.0版本中出现了全局过滤新特性即HasQueryFilte ...

  4. asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)

    本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...

  5. EF Core 2.0 新特性

    前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...

  6. asp.net core 排序过滤分页组件:sieve(1)

    使用asp.net core开发时避免不了要用一个合适的分页组件来让前端获取分页数据.github上面有一个开源的分页组件在这方面很适合我的使用,于是我把他的文档翻译一下,随后会分析它里面的源码.这是 ...

  7. 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 ...

  8. DDD Code First 迁移数据实现EF CORE的软删除,值对象迁移配置

    感谢Jeffcky大佬的博客: EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p ...

  9. EF Core 实现多租户

    目录 SAAS 和多租户 多租户数据隔离方案 使用 EF Core 简单实现多租户 单数据库实现 多数据库实现 源代码 参考 SAAS 和多租户 SaaS(软件及服务)区别于其他应用程序的主要特征就是 ...

随机推荐

  1. 用jquery写自己的form表单验证

    这几天看了锋利的jquery,感觉很不错.特别是jquery强大的选择器.今天就利用jquery写了一个自己的form表单验证的小案例.当巩固下jquery.首先贴下代码,当然只是一个小案例. 思路: ...

  2. 【JZOJ】1341. water(水流)

    题目大意 你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,小镇可以认为是N * M的矩阵.矩阵里的每个单元格都是一个‘a’- ‘z’小写字母,该小写字母表示该格子的高 ...

  3. MySQL语言分类——DML

    DML DML的全称是Database management Language,数据库管理语言.主要包括以下操作: insert.delete.update.optimize. 本篇对其逐一介绍 IN ...

  4. 【开发笔记】- AbstractRoutingDataSource动态数据源切换,AOP实现动态数据源切换

    AbstractRoutingDataSource动态数据源切换 上周末,室友通宵达旦的敲代码处理他的多数据源的问题,搞的非常的紧张,也和我聊了聊天,大概的了解了他的业务的需求.一般的情况下我们都是使 ...

  5. 【转载】C#使用typeof运算符获取对象变量的具体类型Type

    在C#的实际类型操作过程中,有时候需要通过typeof方法获取对象的类型对应的Type变量即具体类型,例如在获取DataTable中某一列的具体数据类型的时候,我们就会用到typeof方法来获取具体的 ...

  6. Qt选择文件路径

    QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./"); ...

  7. Git的下载安装

    下载地址:https://git-scm.com/download/win 命令: git add ...  ---将资源放到缓存区域 git commit  -m "提交说明"  ...

  8. Oracle PLSQL游标、游标变量的使用

    参考文章:https://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实 ...

  9. linux中find命令的使用详解(转载)

    常用命令 find  (目录)   [-type d | f]  (文件夹 | 文件)   -name   (名称,可使用正则表达式) find  /root  -name "*core&q ...

  10. docker上启动mysql镜像,mysq中记录乱码解决方法

    在docker上启动一个mysql, 1. docker pull mysql 2. docker run --name mysql_dev -p 3306:3306 -e MYSQL_ROOT_PA ...