实体框架向所有查询添加where子句

时间:2018-10-02 12:35:33

标签: c# entity-framework linq

我有一个使用Entity Framework和AspNet Identity的项目。

IdentityUser的参数之一是停用字段。

在应用内,如果我想吸引用户,我会这样做:

var users = Context.Users //etc....

但是,我不希望该查询返回任何停用的用户。我知道我可以做到

var users = Context.Users.Where(x => x.Deactivated != true);

但是,我不愿意这样做,因为我敢肯定,及时就会有人忘记添加where子句。

实体是否可以对所有上下文查询自动执行此操作?我发现了:

https://docs.microsoft.com/en-us/ef/core/querying/filters

但是我没有EF内核,无法升级到它。

我知道我可以创建一个包装函数并调用它,但是我正在尝试寻找更好的解决方案...

2 个答案:

答案 0 :(得分:3)

我经常使用XXXStore成员和XXX成员的组合,其中XXXStoreDBSet,而XXX是带有{{1 }}。然后,仅在我想更新数据库时,才在响应AsNoTracking()的查询中使用XXX成员,而对GET进行响应。例如

XXXStore

这具有以下优点:不跟踪不会更新的实体,而是采用DRY方法,这意味着不会在整个地方都冗长地添加 public DbSet<User> UserStore { get; set; } public IQueryable<User> Users => UserStore.AsNoTracking();

这种方法可以很容易地与AsNoTracking()子句结合使用:

where

过滤器也可以工作,但是这种方法的优点是,当您确实确实确实需要访问停用的用户时,很容易将其作为例外。

答案 1 :(得分:0)

您可以使用全局过滤器:

protected override void OnModelCreating(ModelBuilder modelBuilder){
    modelBuilder.Entity<Blog>().Property<string>("TenantId").HasField("_tenantId");
    // Configure entity filters
    modelBuilder.Entity<Blog>().HasQueryFilter(b => EF.Property<string>(b, "TenantId") == _tenantId);
    modelBuilder.Entity<Post>().HasQueryFilter(p => !p.IsDeleted);
}