0

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

您可以像这样在 NHibernate 中执行此操作:NHibernate filter collection

我怎样才能在实体框架中做同样的事情?

4

1 回答 1

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));
于 2013-06-17T18:54:52.540 回答