自己造轮子是一件苦差事。 现在,您可以专注于业务开发,仅需集成 ⭐️Furion⭐️ 即可。
Skip to main content

9.23 实体/全局查询筛选器

9.23.1 查询筛选器

通常,我们系统中有一些维护字段,如 IsDeleted 字段,这个字段用来标识用户已经删除的数据,那么我们需要每次查询数据的时候带上这个字段,避免查询出不该出现的数据。

Furion 提供非常灵活方便的全局查询筛选器,能够应用到每一次查询中。

9.23.2 多种筛选器配置

9.23.2.1 单表筛选器

单表筛选器就是只针对特定实体进行筛选操作,使用简单,只需要在继承 IEntityTypeBuilder<TEntity> 接口并实现即可,如:

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;

namespace Furion.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public Person()
{
CreatedTime = DateTime.Now;
IsDeleted = false;
}

public string Name { get; set; }

public int Age { get; set; }

public string Address { get; set; }

public void Configure(EntityTypeBuilder<Person> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasQueryFilter(u => !u.IsDeleted);
}
}
}

9.23.2.2 全局筛选器

全局筛选器可以配置所有实体应用筛选器中,无需一个一个去配置。使用方法稍微有些复杂,需要动态构建 Lambda 表达式。

实现全局筛选器依赖于 IModelBuilderFilter 接口,该接口提供两个方法:

  • OnCreating:实体构建之前
  • OnCreated:实体构建之后

通过实现这两个方法即可配置全局过滤器,如:

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Linq.Expressions;

namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString")]
public class FurionDbContext : AppDbContext<FurionDbContext>, IModelBuilderFilter
{
public FurionDbContext(DbContextOptions<FurionDbContext> options) : base(options)
{
}

public void OnCreating(ModelBuilder modelBuilder, EntityTypeBuilder entityBuilder, DbContext dbContext, Type dbContextLocator)
{
// 设置软删除表达式
var fakeDeleteQueryFilterExpression = FakeDeleteQueryFilterExpression(entityBuilder, dbContext);
if (fakeDeleteQueryFilterExpression == null) return;

entityBuilder.HasQueryFilter(fakeDeleteQueryFilterExpression);
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议

与我们交流

给 Furion 提 Issue