实体框架 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
中覆盖的可能方法,这些方法似乎都不符合要求。谁能帮忙?
您可以在 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);
}
}