3

次のようなクエリを動的に作成するのに苦労しています。

Dictionary<string, Guid> parms = new Dictionary<string, Guid>();

foreach (var kvp in parms)
{
    var exp = ReportDefinitions.Where(x=> 
        x.Discriminants.Any(y=> y.Key == kvp.Key && y.Value == kvp.Value)
// && more conditions to add here at each cycle
        );  
}

ReportDefinitions.DiscriminantsはIDictionary<string, Guid>;です。単純な式の作成方法は知っていますが、これを作成する方法がわかりません。「Any」は非常に複雑に見えます。理解するのが難しいAnycall

誰もがこれに対処する方法を知っていますか?

4

1 に答える 1

2
var query = parms.Aggregate(ReportDefinitions.AsQueryable(),
  (a, kvp) => a.Where(x => x.Discriminants.Any(
     y => y.Key == kvp.Key && y.Value == kvp.Value)));

ReportDefinitionsのフィルタリングされていないクエリから始めて、すべてのクエリパラメータを折りたたんでいます。最終結果は、ANDのシーケンスと同等のネストされたフィルターのシーケンスです。

重要な洞察は、このプロセスが関数型言語から知られている削減にうまく対応しているということです。オブジェクトへのLINQは、を介してそれをサポートしますAggregate

于 2012-07-06T17:00:30.323 に答える