[Architect] Abp 框架原理解析(3) DynamicFilters

本节目录

  • 介绍
  • 定义Filter
  • 设置Filter

 

这是Abp中多租户、软删除、激活\禁用等如此方便的原因

Install-Package EntityFramework.DynamicFilters

 

定义数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class DemoDb : DbContext
{
    public DemoDb() : base("Default")
    {
    }
 
    public IDbSet<Blog> Blogs { get; set; }
}
 
interface ISoftDelete
{
    bool IsDeleted { get; set; }
}
 
class Blog : ISoftDelete
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
}

 

初始化数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void Main(string[] args)
{
    using (var db = new DemoDb())
    {
        for (int i = 0; i < 5; i++)
        {
            db.Blogs.Add(new Blog { Name = i.ToString() });
        }
 
        for (int i = 0; i < 5; i++)
        {
            db.Blogs.Add(new Blog { Name = i.ToString(), IsDeleted = true });
        }
        db.SaveChanges();
    }
    Console.WriteLine("Done");
 
    Console.ReadLine();
}

 

查询数据

1
2
3
4
5
6
7
private static void Query()
{
    using (var db = new DemoDb())
    {
        Console.WriteLine(db.Blogs.Count());
    }
}

 

 

 

定义Filter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //以下几种效果均一样
    modelBuilder.Filter("IsDeleted", (ISoftDelete entity) => entity.IsDeleted, false);
 
    //modelBuilder.Filter("IsDeleted", (ISoftDelete entity) => entity.IsDeleted == false);
 
    //modelBuilder.Filter("IsDeleted", (Blog entity) => entity.IsDeleted, () =>
    //{
    //    //todo other
    //    return false;
    //});
 
    //多参数情况
    modelBuilder.Filter("BlogFilter",
            (Blog b, int id, bool isDeleted) => (b.Id == id) && (b.IsDeleted == isDeleted),
            () => 1,
            () => false);
}

 

设置Filter

修改参数值

1
2
3
4
5
6
7
8
9
private static void Query()
{
    using (var db = new DemoDb())
    {
        db.SetFilterScopedParameterValue("IsDeleted", true);
        db.SetFilterScopedParameterValue("BlogFilter", "id", 2);
        Console.WriteLine(db.Blogs.Count());
    }
}

 

启用/禁用过滤

禁用代码:

context.DisableFilter("IsDeleted");

context.DisableAllFilter();

modelBuilder.DisableFilterGlobally("IsDeleted");

 

启用代码:

context.EnableFilter();

context.EnableAllFilter();

 

 

参考:

https://github.com/jcachat/EntityFramework.DynamicFilters

 

本文地址:http://www.cnblogs.com/neverc/p/5258184.html

posted @   Never、C  阅读(1832)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示