2011-10-26 6 views
1

システムには、いくつかのクラスのモデル(タスク、請求書、レポートなど)があります。テーブルごとに、ログされた会社によって、いくつかのパラメータ(たとえば、companyID)によって異なります。私はすべてのテーブル、すべてのクエリ、すべての保存などがこのパラメータを監視する必要があります。このパラメータを追加する各クエリにEFにLINQを伝える簡単な方法はありますか?言い換えれば、私はちょうど入力した場合:EFのすべてのモデルに共通のWHEREパラメータをLINQで使用する方法は?

List<Report> list = db.Reports.Where(r => r.companyID = idOfLoggedComp) 

おかげで答えのためにたくさんのようにログインして、会社の企業IDにのみ関連記録を選択した

List<Report> list = db.Reports; 

答えて

0

簡単な答えはノーです。 EFにはグローバルフィルタが完全にありません。あなたは、いくつかのラッパークラスを作成し、カスタムの内側のクエリを非表示にする必要がありますようにIQueryableを公開:

public class CompanyRestrictedDataAccess 
{ 
    private int _companyId; 
    private ObjectContext _context; 

    public CompanyDataAccess(int companyId, ObjectContext context) 
    { 
     _companyId = companyId; 
     _context = context; 
    } 

    public IQueryable<Reports> Reports 
    { 
     get 
     { 
      return _context.Reports.Where(r => r.CompanyId == _companyId); 
     } 
    } 
} 

しかしので、これはまだ非常に貧弱な回避策です:あなたは、クエリの代わりに、コンテキスト ため、このクラスを使用する必要があります

  • これは直接アクセスでのみ機能します。熱心な読み込みと遅延読み込みは、すべての条件を完全に無視します(EFでの熱心な読み込みや遅延読み込みはフィルタリングできません)。

したがって、アプリケーションでの読み込みを正しく処理する必要があります。

EFが提供する唯一の解決策は、条件付きマッピングと呼ばれますが、EDMXで直接ハードコーディングされた単一のフィルタリング条件であるため、アプリケーションは単一の会社でのみ動作します。

0

あなたは、会社のテーブルにIDフィールドを指し、あなたのテーブルのFKSを持っているなら、あなたはこのように、単に文脈であなたの「会社」テーブルを介して、それらにアクセスすることで、すべての関連するテーブルをフィルタリングすることができるはずです。

List<Report> list = db.Company.Reports; 

あまり面倒なく。

それとも、あなたはまだ文脈であなたの会社を持っていない場合:

var company = db.FirstOrDefault(c => c.ID == companyId); 
List<Report> list = company.Reports; 
0

EFではこれがデフォルトでサポートされていませんが、いくつかのデザインパターンが役立ちます。

特に、リポジトリと組み合わせたCriteriaパターン。 This articleは良い読み取り です。

基準を作成して組み合わせる方法について説明します(デコレータパターン)。ベース基準クラスにフィルタを追加する場合は、それがすべてのクエリに追加されていることを確認することができます。

フィルタリングラディスラフが指摘しているように、ナビゲーションデータには多くの困難があります。 Expression Visitorを使用してクエリを変更するか、基本Criteriaクラスを使用してLinq To Objectsフィルタを実装することができますが、これはデータベースからデータをロードすることを意味します。

0

これが役立つかどうかは不明です。このようなことをすることができます。

条件場合は、より多くのを使用して、他のパラメータを追加することができます
string whereClause = ""; 

if(cId > 0) 
{ 
whereClause += "it.companyID [email protected] && " 

ob.Add(New ObjectParameter("companyID", cId)); 

} 

// ...

whereClause = whereClause.Remove(whereClause.Length, -3); 

qry = dEntity.Reports.Where(whereClause, ob.ToArray); 
関連する問題