0

すべてのリポジトリが (自家製の) GenericRepository 基本クラス (T はモデル内のエンティティ) に基づいており、GetContext()、GetObjectSet() などのメソッドを公開する多層アプリケーションがあります。 . これを継承するリポジトリがコンテキストにアクセスできるようにします。これは、Include() を呼び出す必要があるためです。WCF サービスを介してデータを渡しているため、関連するすべてのエンティティを熱心にロードする必要があります。

すべてのエンティティは、Active bool プロパティを持つインターフェイスを実装します。実行したいことは、クエリの実行をインターセプトし、Active プロパティでフィルタリングして、すべてのクエリが true に設定されているエンティティのみを返すようにすることです。

これはできますか?EF に基づいて構築された Lightswitch には、クエリ実行の奥深くで発生するキャプチャ可能なイベントがあり、この種のフィルタリングを行うことができます。これを可能にするEF自体には何も見つかりません。

誰でもアイデアはありますか?ありがとう

4

2 に答える 2

1

私が考えることができる最善の方法は、リポジトリメソッドに Expression を取り込むことです (つまりExpression<Func<T, bool>> predicate)。そうすれば、実際のリポジトリ自体ですべてのクエリを実行できます(したがって、クライアント側のコードがデータレイヤーロジックにアクセスする方法を許可しません)Where。リポジトリメソッドから戻る前に を追加して、アクティブです。

私が使用したこのスタイルの例は次のとおりです。

   public IQueryable<T> Grab(Expression<Func<T, bool>> predicate)
   {
     return DbSet.Where(predicate);
   }

DbSet は、クエリしようとしている実際のテーブルです。そうすれば、最後に追加.Where(x => x.Active)して、まだデータベースに対して実行しないで (ありがとう、遅延実行!)、探している正確なレコードを取得できます。

于 2013-02-14T16:39:56.457 に答える
1

EF 5 ではInclude、 の拡張メソッドでIQueryableあるため、次のように実行できます。

var query = dbSet.Where( o => o.IsActive ).Include( ... )

つまりDbSet<T>、一般的なリポジトリからa を返す必要はありませんIQueryable<T>

これが要件を満たしている場合はWhere、一般的なリポジトリ メソッドに句を追加できます。

partial class GenericRepository<T>
{
  public IQueryable<T> Query( bool includeInactive = false )
  {
    return ctx.Set<T>().Where( o => includeInactive || o.IsActive );
  }
}
于 2013-02-14T16:51:09.377 に答える