0

組織構造には説明責任パターンを使用しています。linqを使用してnhibernateを使用して、いくつかの部門と位置を見つけましたが、2つの問題があります。

var query = 
  Repository<Party>.Find(p => p.IsInternal == true)
    .Where(p => p.Parents.Any(c => c.Parent.PartyId == id))
    .Where(p => 
      (
        p.PartyType.PartyTypeId == (int)PartyTypeDbId.Department && 
        _secretariat.Departments.Select(c => c.PartyId).Contains(p.PartyId)
      )
      || 
      (
        p.PartyType.PartyTypeId == (int)PartyTypeDbId.Position && 
        p.Children.Any(c => 
          c.AccountabilityType.AccountabilityTypeId == (int)AccountabilityTypeDbId.TenurePersonOfPosition &&  
          ((Person)c.Child).UserName != null)
        )
    );

最初に:クエリのこの部分に対して「未処理の式タイプ:1003」を取得しました:「_ secretariat.Departments.Select(c => c.PartyId).Contains(p.PartyId)」および「プロパティが見つかりません」「UserName」を取得しました

ストアドプロシージャを使用する必要があると思う複雑なクエリがたくさんあります。

悪い英語でごめんなさい!

4

3 に答える 3

2

LINQで実行できる優れた点の1つは、クエリを複数の部分に分割することです。結果が列挙されるまで実行されない式ツリーを構築しているので、(SQLのように)すべてを1行で実行する必要はありません。

IQueryableに適用できる再利用可能な「フィルター」を作成することもできます。これらのフィルター関数は、引数としてIQueryableを受け入れ、結果として1つを返します。必要に応じて、これらを拡張メソッドとして作成できます(私は好きです)。

差し迫った問題については、サブクエリを試行する代わりに、_secretariatで結合を試行することをお勧めします。サブクエリが機能しないシナリオでそれらが機能するのを見てきました。

于 2009-08-30T07:45:54.187 に答える
0

Lanceのコメントに加えて、コンパイルされたLinqクエリを確認し、SOLIDの原則に従う責任の一部を分割することをお勧めします。

于 2009-08-30T08:58:24.010 に答える
0

Any linqメソッドを含めると、Containsに問題があることもわかりました。ただし、AnyはAny内でうまく機能しているようです。したがって、次のようになります。

_secretariat.Departments.Select(c => c.PartyId).Any(x => x == p.PartyId)
于 2011-05-17T20:44:58.157 に答える