EF Core 6 - 如何使用多个 DbSet 来预过滤同一个表

Ema*_*tti 1 .net c# entity-framework-core global-query-filter

我正在尝试找到此问题的最佳解决方案。\n我有一个名为 的数据库表Customer。该表有一个名为 的布尔列Status,它告诉我该客户是否处于活动状态。\n我想创建一种 \xe2\x80\x9c 全局查询过滤器\xe2\x80\x9d 以仅提取以下客户的列表:活跃的,但我知道,如果我在当前拥有的唯一 DbSet 上配置查询过滤器,我总是只会过滤活跃的客户,这对我来说不好,因为有时我还需要非活跃的客户(例如在管理页面)。

\n

我的想法是创建这样的东西,但我不知道如何配置它:

\n
public class Customer {\n   //\xe2\x80\xa6properties\n\n   public bool Status {get; set;}\n}\n\npublic DbSet<Customer> Customers {get; set;}\npublic DbSet<Customer> CustomersActive {get; set;}\n
Run Code Online (Sandbox Code Playgroud)\n

这可能吗?

\n

Oli*_*bes 6

相反,公开IQueryable<Customer>属性:

public DbSet<Customer> Customers {get; set;}
public IQueryable<Customer> CustomersActive => Customers.Where(c => c.Status);
public IQueryable<Customer> CustomersInactive => Customers.Where(c => !c.Status);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,更好的名称bool StatusActiveor IsActive

请注意,您可以链式Where调用。这相当于将条件与 组合起来&&

var result = Customers
    .Where(c => c.Status)
    .Where(c => c.Name.StartsWith("A"));
Run Code Online (Sandbox Code Playgroud)

相当于

var result = Customers
    .Where(c => c.Status && c.Name.StartsWith("A"));
Run Code Online (Sandbox Code Playgroud)

因此,这种方法不会限制您查询的可能性。