我有一个带有约会集合的 Person 类。我想制作一个 FutureAppointments 集合,其中仅包含将来发生的约会,因此我可以简单地包含该过滤后的集合。
您可以像这样在 NHibernate 中执行此操作:NHibernate filter collection
我怎样才能在实体框架中做同样的事情?
我有一个带有约会集合的 Person 类。我想制作一个 FutureAppointments 集合,其中仅包含将来发生的约会,因此我可以简单地包含该过滤后的集合。
您可以像这样在 NHibernate 中执行此操作:NHibernate filter collection
我怎样才能在实体框架中做同样的事情?
没有办法通过开箱即用的实体框架来实现这一点。您必须创建自己的实现。目标是在创建上下文时将过滤器应用于适用的数据集。这是一种方法:
过滤器接口:
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));