我有一个带有约会集合的Person类。我想创建一个FutureAppointments集合,其中仅包含将来发生的约会,因此我可以简单地包含已过滤的集合。
你可以在NHibernate中这样做:NHibernate filter collection
我如何在Entity Framework中做同样的事情?
答案 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));