实体框架 5 - 仅选择实体处于活动状态的实体

本文关键字:实体 活动状态 框架 选择 | 更新日期: 2023-09-27 17:55:51

使用代码优先方法,我创建了许多不同的实体,这些实体继承自具有属性IsActive IConcurrent的接口,例如:

public class Currency : IConcurrent
{
    public string CurrencyId { get; set; }
    public string Description { get; set; }
    public bool IsActive { get; set; }
}

每次选择实体时,我发现自己总是必须包含一个条件子句,例如这个真正的基本示例:

db.Currencies.Where(c => c.IsActive);

我的问题是,是否可以截取/挂钩到DbContext中,以便我的 LINQ 查询始终为继承 IConcurrent 接口的实体返回IsActive == true,以避免每次都显式添加.Where(c => c.IsActive)

到目前为止,我已经研究了在DbContext中覆盖的可能方法,这些方法似乎都不符合要求。谁能帮忙?

实体框架 5 - 仅选择实体处于活动状态的实体

您可以在 Set<> 方法上使用筛选来获取活动实例,如下所示:

public IQueryable<T> GetActive<T>() where T : class, IConcurrent
{
   return Set<T>().Where(e => e.IsActive);
}

此方法可以包含在继承DbContext类的类中,也可以将其转换为扩展方法,如下所示:

public static DbContextExtensions
{
  public static IQueryable<T> GetActive<T>(this DbContext context) 
    where T : class, IConcurrent
  {
     return context.Set<T>().Where(e => e.IsActive);
  }
}

条件映射在模型优先方法中受支持,但在代码优先方法中不直接支持。您可以通过在 DBContext 中创建类似于以下内容的属性来获得解决方法;

public IQueryable<Currency> ActiveCurrencies 
{
    get 
    {
        db.Currencies.Where(c => c.IsActive);
    }
}