4

使用 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 查询将始终返回IsActive == true继承 IConcurrent 接口的实体,以避免.Where(c => c.IsActive)每次都显式添加?

到目前为止,我已经研究了可能的覆盖方法,DbContext其中没有一个似乎符合要求。任何人都可以帮忙吗?

4

2 回答 2

4

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

public IQueryable<Currency> ActiveCurrencies 
{
    get 
    {
        db.Currencies.Where(c => c.IsActive);
    }
}
于 2013-01-25T12:35:38.603 回答
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);
  }
}
于 2013-01-25T12:44:29.117 回答