ABP-数据过滤器(Fliter)
ABP预定义过滤器
过滤器禁用
对于默认启动的过滤器,可以使用using语句临时禁用,也可全局禁用
using语句临时禁用软删除过滤
using (CurrentUnitOfWork.DisableAuditing(AbpDataFilters.SoftDelete)) { var list=_approvaloperaterecordsRepository.GetAll(); } using (_unitOfWorkManager.Current.DisableAuditing(AbpDataFilters.SoftDelete)) { var list=_approvaloperaterecordsRepository.GetAll(); }
注:您可以注入 IUnitOfWorkManager 并像示例中一样使用它,如果您的类 继承一些特殊的基类(如应用程序服务、 AbpController, AbpApiController...)也可以使用示例中快捷方式CurrentUnitOfWork 。
全局禁用过滤器
可以在模块的PreInitialize方法中配置如下内容全局禁用
Configuration.UnitOfWork.OverrideFilter(AbpDataFilters.SoftDelete, false);
过滤器参数设置
带参过滤器还可重新设置参数,如下 IMayHaveTenant 设置 tenantId 值的示例
CurrentUnitOfWork.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, 42);
自定义数据过滤器
1.定义接口
public interface IHasPerson { int PersonId { get; set; } }
2.让需要该数据过滤的实体继承接口
public class Phone : Entity, IHasPerson { [ForeignKey("PersonId")] public virtual Person Person { get; set; } public virtual int PersonId { get; set; } public virtual string Number { get; set; } }
3.在我们的 DbContext 类中,我们 覆盖 OnModel创建并定义筛选器
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Filter("PersonFilter", (IHasPerson entity, int personId) => entity.PersonId == personId, 0);//“PersonFilter”过滤器名称,名字唯一 }
“PersonFilter”是此处筛选器的唯一名称。第二个参数定义了过滤器接口和personId过滤器参数(如果过滤器不是参数化的,则不需要)。最后一个参数是personId的默认值。
4.最后,我们必须在模块的PreInitialize方法中将此筛选器注册到ASP.NET Boilerplate的工作单元系统中
Configuration.UnitOfWork.RegisterFilter("PersonFilter", false);
第一个参数与我们之前定义的唯一名称相同。第二个参数指示默认情况下是启用还是禁用此筛选器。在声明了这样一个参数过滤器之后,我们可以通过在运行时提供它的值来使用它。
5.使用
using (CurrentUnitOfWork.EnableFilter("PersonFilter"))//临时启用“PersonFilter” { using(CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42))//设置"PersonFilter"的参数“personId”参数设置值 { var phones = _phoneRepository.GetAllList(); //... } }
我们可以从某些来源获取personId,而不是静态编码。上面的例子是针对参数过滤器的。一个过滤器可以有零个或多个参数。如果它没有参数,则不需要设置过滤器参数值。此外,如果默认情况下已启用,则无需手动启用(您可以始终禁用此功能)。