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

微软自带的: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. C# 随笔写txt

    public static void WriterFile(string file) { string path = AppDomain.CurrentDomain.BaseDirectory; // ...

  2. WPF控件介绍(2)

    上一章讲到了布局.这点就有点类似建筑设计.第一步是出图纸.整体的结构.而第二步就是堆砌, 建筑学里面也会有很多描述, 例如砖头,水泥.玻璃.瓷板.而在WPF中, 这一切的基础也就是控件.用于填充结构的 ...

  3. 如何简单使用tensorboard展示(一)

    我使用tensorboard中的graph做了展示,至于其它功能可以类推,其代码如下: import numpy as npimport tensorflow as tf x_img = np.arr ...

  4. Vue+element 解决浏览器自动填充记住的账号密码问题

    我们在做form表单的时候,会发现,浏览器会自动的将我们之前保存的密码, 自动的填充到表单中input 为 type="password" 的框中 登录页面也就算了,但是注册页面就 ...

  5. Qt中QWidget、QDialog和QMainWindow

    QWidget 类是所有用户界面对象的基类.只有一个"页面" QMainWindow 是一个"窗口".含有菜单栏.状态栏.工具栏.停靠窗口.中心窗口 QDial ...

  6. NPOI.dll 在哪里?

    一.问题 NPOI下载后找不到网上人家说的几个DLL https://bbs.csdn.net/topics/392510552 二.答案: 1.VS2015引用NPOI2.4.1和NuGet的安装方 ...

  7. ARM64编译工具链下载

    下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCel ...

  8. Go Programming Language

    [Go Programming Language] 1.go run %filename 可以直接编译并运行一个文件,期间不会产生临时文件.例如 main.go. go run main.go 2.P ...

  9. VUE简单的语法

    这篇主要记录了在使用过程的当中,对于vue的一些方法的理解 1.Vue生命周期中mounted和created的区别 created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视 ...

  10. 一天撸完《 Learning Jupyter 5 2nd Edition》

    因为工作需要了解这个应用的大概功能. 网上找不到下载的,CSDN没积分. 最后,在道客上找到了这个PDF.花了一天时间浏览了一下, 只留意了python功能,其它语言略去. widget和jupyte ...