在实体框架中映射筛选的集合

时间:2013-06-12 02:43:56

标签: entity-framework-5

我有一个带有约会集合的Person类。我想创建一个FutureAppointments集合,其中仅包含将来发生的约会,因此我可以简单地包含已过滤的集合。

你可以在NHibernate中这样做:NHibernate filter collection

我如何在Entity Framework中做同样的事情?

1 个答案:

答案 0 :(得分:0)

没有办法通过开箱即用的实体框架来实现这一目标。您必须创建自己的实现。目标是在创建上下文时将过滤器应用于适用的数据集。这是一种方法:

过滤界面:

public interface IFilter<T> where T : DbContext
{
    T DbContext { get; set; }
    void Apply();
}

上下文实现:

public class MyContext: DbContext
{
    public void ApplyFilters(IList<IFilter<MyContext>> filters)
    {
        foreach (var filter in filters)
        {
            filter.DbContext = this;
            filter.Apply();
        }
    }

    public IDbSet<MyDbSet> MyDbSet { get; set; }
}

过滤器实施:

public class ActiveSetFilter:  IFilter<MyContext> 
{
    public MyContext DbContext  {  get;  set;  }

    public void Apply()
    {
        DbContext.MySet= new FilteredDbSet<MySet>(DbContext, d => d.IsActive);
    }
}

使用过滤器:

var context = new MyContext();
context.ApplyFilters(new List<IFilter<MyContext>>()
                     {
                         new ActiveSetFilter()                                         
                     });

var myDbSet= context.MyDbSet.ToList(); // will only have active rows

以下是FilteredDbSet的样子。它本质上是一个上下文构造函数,它将表达式作为参数。

*编辑*

过滤时间包括:

DbContext.MySet = new FilteredDbSet<MySet>(DbContext, d => d.IsActive && d.All(x => x.IsActive));