【EFCore】笔记18 全局查询过滤器

/ 0评 / 0

EFCore 中可以使用 Where 方法进行查询,但在某些时候,我们希望过滤某些数据,但不想在每次查询的时候都使用 Where 方法,这就需要使用全局查询过滤器了。

全局查询过滤器是对某个实体进行设定的,一旦设置,之后对这个实体的所有查询都会加上这个全局过滤条件,逻辑上是与。全局查询过滤器的一个典型应用场景就是软删除,通过实体的某个或某些属性来表示该实体是否已"删除",可以在不删除数据的情况下,在逻辑上表示删除关系。而全局查询过滤器则提供了一种方便地过滤掉被软删除实体的方式。

设置全局查询过滤器很简单,只需要通过 EntityTypeBuilder.HasQueryFilter 方法即可。下面以 Book 为例,以属性 IsDeleted 表示是否被软删除:

public void Configure(EntityTypeBuilder<Book> builder)
{
    builder.ToTable("T_Books");
    builder.HasMany<Author>(e => e.Authors).WithMany(e => e.Books);
    builder.HasQueryFilter(e => !e.IsDeleted);
}

这样就配置好了,在之后对 Book 实体的所有查询,都会忽略被软删除的数据。当然,有些时候我们可能需要查询所有实体(包含被软删除的数据),这个时候我们可以使用 IgnoreQueryFilter 方法来忽略全局查询过滤器,下面这行代码查询所有被软删除的 Book:

var books = ctx.Books.IgnoreQueryFilters().Where(e => e.IsDeleted);

 

Leave a Reply

Your email address will not be published. Required fields are marked *