2009-07-07 9 views
3

私はおおよそ次のようになります構造:LINQとグループ

List<ProductLine> -> ID 
        Name 
        ... 
        List<LineOfBusiness> -> ID 
              Name 
              ... 
              List<Watchlist> -> ID 
                   Name 
                   ReportCount 

Aウォッチリストは複数のLOBの下に存在することができますが、ReportCountだけ下に存在するレポートのカウントになりますがそのWatchListのLoB。私は、このような構造でそれらを必要とします。なぜなら、所与のウォッチリストのLoB内にいくつのレポートが存在するのかが他の場所で重要なのだからです。

私がする必要があるのは、(IDに基づいてグループ化された)別個のWatchListsのリストを取得し、すべてのLoBにわたってそのWatchlistのReportCountのSUMをReportCountにすることです。ネストされた選択ロジックを正しく動作させることはできません。

答えて

8

階層構造をフラット化する方法は、SelectManyメソッドを使用することです。最初SelectMany呼び出しは、すべての項目ですべてのLineOfBusinessのオブジェクトの配列を元のリストを変換します

var result = mainList.SelectMany(x => x.LineOfBusinessList) 
        .SelectMany(lob => lob.Watchlists) 
        .GroupBy(wl => wl.ID) 
        .Select(g => new { 
          WatchlistID = g.Key, 
          WatchlistName = g.First().Name, 
          ReportCount = g.Sum(item => item.ReportCount) 
        }); 

:あなたはこのようなものが必要。第2のSelectManyコールは、LineOfBusinessオブジェクトのシーケンスを、すべてのWatchlistオブジェクトを含むシーケンスに変換します。次に、Watchlistをグループ化してIDでグループ化し、実際のクエリを実行します。

+0

g.Key.IDは機能しませんし、g.Key.Nameも機能しません。 g.Keyを求めてWatchlistIDを選択できると仮定しますが、どのようにして名前を取得できますか? – Parrots

+0

オウム:オオカミ。うん、あなたは正しいです。私はもともとWatchlistには独自のIDがあり、Equalsをチェックしていると思っていました...実際には名前でグループ化していないので、名前によって異なる名前が付けられると思います。名前が一意であることを知っているので、g.First()。Nameを使用して取得してください。 –

+0

@Parrots:Btw、更新された回答を参照してください。 –