实体框架5 - 仅选择实体IsActive的实体

时间:2013-01-25 12:16:58

标签: c# asp.net-mvc-3 entity-framework entity-framework-5

使用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中覆盖的可能方法,这些方法似乎都不符合要求。有人可以帮忙吗?

2 个答案:

答案 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);
  }
}