4

IConcurrentCode First アプローチを使用して、プロパティを持つインターフェイスから継承するさまざまなエンティティを多数作成しましたIsActive。たとえば、次のようになります。

public class Currency : IConcurrent
{
    public string CurrencyId { get; set; }

    public string Description { get; set; }

    public bool IsActive { get; set; }
}

エンティティを選択するたびに、この実際の基本的な例のような条件句を常に含める必要があることに気付きます。

db.Currencies.Where(c => c.IsActive);

DbContext私の質問は、LINQ クエリがIsActive == trueIConcurrent インターフェイスを継承するエンティティに対して常に返されるように、.Where(c => c.IsActive)毎回明示的に追加する必要がないように、どのようにインターセプト/フックすることができるかということです。

DbContextこれまでのところ、いずれも条件に合わないと思われるオーバーライド可能なメソッドを見てきました。誰でも助けることができますか?

4

2 に答える 2

4

メソッドでフィルタリングを使用してSet<>、次のようなアクティブなインスタンスのみを取得できます。

public IQueryable<T> GetActive<T>() where T : class, IConcurrent
{
   return Set<T>().Where(e => e.IsActive);
}

このメソッドは、クラスを継承するクラスに含めることもDbContext、次のように拡張メソッドにすることもできます。

public static DbContextExtensions
{
  public static IQueryable<T> GetActive<T>(this DbContext context) 
    where T : class, IConcurrent
  {
     return context.Set<T>().Where(e => e.IsActive);
  }
}
于 2013-01-25T12:44:29.117 に答える
4

条件付きマッピングはモデル ファースト アプローチでサポートされていますが、コード ファースト アプローチでは直接サポートされていません。次のようなプロパティを DBContext に作成することで回避できる場合があります。

public IQueryable<Currency> ActiveCurrencies 
{
    get 
    {
        db.Currencies.Where(c => c.IsActive);
    }
}
于 2013-01-25T12:35:38.603 に答える