Abp.VNext-数据过滤

如何实现软删除数据查询过滤

实体类继承ISoftDelete接口后,查询获取到的返回结果将不包含已删除的数据。

如何关闭软删除数据过滤

全局方式关闭软删除数据过滤

EntityFrameworkCoreModule模块类中使用。

[DependsOn(typeof(AbpEntityFrameworkCoreMySQLModule))]
public class EntityFrameworkCoreModule : AbpModule
{
     public override void ConfigureServices(ServiceConfigurationContext context)
     {
        Configure<AbpDataFilterOptions>(options => {
            options.DefaultStates[typeof(ISoftDelete)] = new DataFilterState(isEnabled:false);
        });
     }
}
局部方式关闭软删除数据过滤

应用层或仓储层使用。

using (DataFilter.Disable<ISoftDelete>())
{
    //查询
}

如何实现自定义数据查询过滤

案例场景:黑名单查询过滤

  1. 定义过滤器接口
 /// <summary>
 /// 黑名单过滤器
 /// </summary>
 public interface IBlackNameFilter
 {
     public string Name { get; set; }
 }
  1. 实体类实现该过滤器接口
public class News:IBlackNameFilter
{

}
  1. 重写DbContext中的 ShouldFilterEntity 和 CreateFilterExpression方法
/// <summary>
/// 控制黑名单自定义过滤器是否启用
/// </summary>
protected bool isActiveBlackNameFilterEnabled => DataFilter?.IsEnabled<IBlackNameFilter>() ?? false;

protected override bool ShouldFilterEntity<TEntity>(IMutableEntityType entityType)
{
  if (typeof(IBlackNameFilter).IsAssignableFrom(typeof(TEntity)))
  {
      return true;
  }

  return base.ShouldFilterEntity<TEntity>(entityType);
}

/// <summary>
/// 定义黑名单自定义过滤器过滤规则
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <returns></returns>
protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
{
    var expression = base.CreateFilterExpression<TEntity>();

    if (typeof(IBlackNameFilter).IsAssignableFrom(typeof(TEntity)))
    {
        List<string> filterNames = new List<string> { "傻逼", "贱人" };

        //通过实体中的Name字段判断是否是黑名单
        Expression<Func<TEntity, bool>> isActiveFilter = e => !isActiveBlackNameFilterEnabled || !filterNames.Contains(EF.Property<string>(e, "Name"));

        expression = expression == null ? isActiveFilter : CombineExpressions(expression, isActiveFilter);
    }

    return expression;
}

如何关闭自定义数据过滤

方式一:此方式执行方法结束后会自动释放变量空间

using var blackNameFilter = DataFilter.Disable<IBlackNameFilter>();
//查询代码

方式二:只在{}内有效

using (DataFilter.Disable<IBlackNameFilter>())
{
    //查询代码
}
posted @ 2024-11-19 17:50  相遇就是有缘  阅读(40)  评论(0编辑  收藏  举报
  1. 1 我记得 赵雷
  2. 2 北京东路的日子 汪源
  3. 3 把回忆拼好给你 王贰浪
我记得 - 赵雷
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available