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

Ale*_*lex 2 c# linq entity-framework

我有一个使用实体框架和 AspNet Identity 的项目。

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

在应用程序中,如果我想获得用户,我会这样做:

var users = Context.Users //etc....
Run Code Online (Sandbox Code Playgroud)

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

var users = Context.Users.Where(x => x.Deactivated != true);
Run Code Online (Sandbox Code Playgroud)

然而,我不愿意这样做,因为我确信有一天有人会忘记添加这个 where 子句。

有没有办法让实体对所有上下文查询自动执行此操作?我发现了这个:

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

但我没有 EF core,无法升级到它。

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

Jon*_*nna 6

XXXStore我经常使用成员和XXX成员的组合,其中 theXXXStore是 the DBSet,theXXX是带有 的查询AsNoTracking()。然后,我XXX在响应GETs 的查询中使用这些成员,并且XXXStore仅当我想更新数据库时才使用这些成员。例如

    public DbSet<User> UserStore { get; set; }

    public IQueryable<User> Users => UserStore.AsNoTracking();
Run Code Online (Sandbox Code Playgroud)

这样做的优点是不跟踪不会更新的实体,但使用 DRY 方法意味着不会AsNoTracking()在各处添加冗长的内容。

这种方法可以很容易地与一个子句结合起来where

    public DbSet<User> UserStore { get; set; }

    public IQueryable<User> Users => UserStore.AsNoTracking().Where(u => !u.Deactivated);
Run Code Online (Sandbox Code Playgroud)

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