0

予定のコレクションを持つ Person クラスがあります。将来発生する予定のみを含む FutureAppointments コレクションを作成したいので、そのフィルター処理されたコレクションを単純に含めることができます。

次のように NHibernate でこれを行うことができます: NHibernate フィルター コレクション

Entity Framework で同じことを行うにはどうすればよいですか?

4

1 に答える 1

0

そのまま使用できる 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));
于 2013-06-17T18:54:52.540 に答える