使用Code First方法我创建了许多不同的实体,这些实体继承了具有属性IConcurrent
的接口IsActive
,例如:
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
中覆盖的可能方法,这些方法似乎都不符合要求。有人可以帮忙吗?
答案 0 :(得分:4)
Model First方法支持条件映射,但Code First方法不直接支持。您可以通过在DBContext中创建类似于以下内容的属性来解决此问题;
public IQueryable<Currency> ActiveCurrencies
{
get
{
db.Currencies.Where(c => c.IsActive);
}
}
答案 1 :(得分:4)
您可以使用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);
}
}