予定のコレクションを持つ Person クラスがあります。将来発生する予定のみを含む FutureAppointments コレクションを作成したいので、そのフィルター処理されたコレクションを単純に含めることができます。
次のように NHibernate でこれを行うことができます: NHibernate フィルター コレクション
Entity Framework で同じことを行うにはどうすればよいですか?
予定のコレクションを持つ Person クラスがあります。将来発生する予定のみを含む FutureAppointments コレクションを作成したいので、そのフィルター処理されたコレクションを単純に含めることができます。
次のように NHibernate でこれを行うことができます: NHibernate フィルター コレクション
Entity Framework で同じことを行うにはどうすればよいですか?
そのまま使用できる Entity Framework でこれを実現する方法はありません。独自の実装を作成する必要があります。目標は、コンテキストを作成するときに、該当するデータ セットにフィルターを適用することです。1 つのアプローチを次に示します。
フィルター インターフェイス:
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));