https://github.com/stratosblue/cuture.entityframework.dynamicfilter
An extension library for `EntityFrameworkCore` to support dynamic global filters. 一个 `EntityFrameworkCore` 的拓展库,用于支持动态的全局过滤器。
https://github.com/stratosblue/cuture.entityframework.dynamicfilter
dynamic-filter ef entity-framework global-filter
Last synced: about 1 month ago
JSON representation
An extension library for `EntityFrameworkCore` to support dynamic global filters. 一个 `EntityFrameworkCore` 的拓展库,用于支持动态的全局过滤器。
- Host: GitHub
- URL: https://github.com/stratosblue/cuture.entityframework.dynamicfilter
- Owner: stratosblue
- License: mit
- Created: 2023-11-23T09:22:24.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-12-31T14:22:47.000Z (over 1 year ago)
- Last Synced: 2025-02-15T03:41:42.707Z (3 months ago)
- Topics: dynamic-filter, ef, entity-framework, global-filter
- Language: C#
- Homepage:
- Size: 33.2 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# Cuture.EntityFramework.DynamicFilter
## 1. IntroAn extension library for `EntityFrameworkCore` to support dynamic global filters. 一个 `EntityFrameworkCore` 的拓展库,用于支持动态的全局过滤器。
- 动态全局过滤器;
- 支持自由组合多个过滤器;
- 全局过滤器支持排序与位置设置(针对联合索引场景,`EntityFrameworkCore` 的 `QueryFilter` 只能附加到查询头部,对联合索引不友好);
- 支持查询时忽略部分过滤器;
- 目标框架 `net7.0`+;### NOTE!!!
- 会替换掉 `EntityFrameworkCore` 的 `IQueryCompiler`, 可能与其它通过此逻辑实现功能的库冲突;
- 与 `EntityFrameworkCore` 的 `QueryFilter` 属于不同的实现,能够共存,内部实现了对 `EntityFrameworkCore` 的 `IgnoreQueryFilters` 的支持,但只针对单个子查询;
## 2. 快速开始- 任何已引用 `EntityFrameworkCore` 的项目, 引用包:
```xml
```
- 配置 `DbContext` 时启用 `DynamicQueryFilter`
```C#
services.AddDbContext((IServiceProvider serviceProvider, DbContextOptionsBuilder options) =>
{
//Other options
options.UseDynamicQueryFilter();
});
```- 向 `DI` 容器注册并配置全局过滤器
```C#
services.AddEntityFrameworkDynamicQueryFilter(options =>
{
// 配置实体 User 的过滤器
options.Entity(builder =>
{
//添加头部表达式过滤器,表达式过滤器根据查询时 ServiceProvider 中的服务状态动态构造,表达式将在查询 User 时拼接到查询头部
builder.AddHeadFilter(provider =>
{
var currentTenant = provider.GetRequiredService();
return currentTenant.Id is null
? n => true
: n => n.TenantId == currentTenant.Id;
});//添加过滤器 MyQueryFilter(从DI容器中获取),其名称、位置、排序由 MyQueryFilter 内部确定
builder.AddFilter();//添加尾部表达式过滤器,其名称为 SoftDeletion,表达式将在查询 User 时拼接到查询末尾
builder.AddTailFilter("SoftDeletion", n => n.IsDeleted == false);//Other options
});
});
```至此已完成所有配置,在使用对应的 `DbContext` 查询时将会自动应用声明的查询过滤器
-------
## 3. 查询时禁用全局过滤器
- 使用 `EntityFrameworkCore` 的 `IgnoreQueryFilters` 禁用过滤器
```
var query = context.Users.IgnoreQueryFilters();
```- 根据名称禁用过滤器
```
var query = context.Users.IgnoreQueryFilter("SoftDeletion");
```- 根据过滤器类型禁用过滤器
```
var query = context.Users.IgnoreQueryFilter(typeof(MyClassQueryFilter));
```## 4. 实现基于类型的过滤器
实现 `IDynamicQueryFilter` 接口,或直接从 `DynamicQueryFilter`派生;
## 未完待续。。。