2009-04-06 19 views
8

私はそうのようなデータのリストを持っている:平坦化LINQのグループは、クエリ

ID AddressPurpose Address ... 
1 L 
1 P 
2 L 
2 P 
3 P 
3 L 
4 P 
4 L 
5 P 
6 L 

は、私がデータをフィルタリングすることができるようにしたいので、それは他の返されたP行がある場合は、各固有の番号についてL行が返されます。だから、データは次のようになります。

ID AddressPurpose Address ... 
1 P 
2 P 
3 P 
4 P 
5 P 
6 L 

現時点では私は正常に動作し、このクエリを持っている:

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID 
      into g 
       select g; 

var finalList = new List<Company>(); 
foreach (var list in query) 
{ 
    finalList.Add(list.First()); 
} 
return finalList; 

は余分のforeachを使用せずにこれを行うには良い方法はありますか?

var query = 
    from i in (
     from c in list 
     orderby c.AddressPurpose descending 
     group c by c.ID into g 
     select g) 
    select i.First(); 

return query; 

私はこれがそれ(または可能性も最善)を行うための唯一の方法ではないと確信しているが、それはあなたの「foreachのを」包むん:

答えて

3

代わりにselectg.First()をご利用ください。

+0

私は自分自身を編集していたはずですが、lc! +1! –

+0

そうだね。ネストされたクエリも好きです。複雑なクエリを繰り返す必要がある場合はいつでも再利用できます。 –

+0

ありがとうございます。それは素晴らしい作品です。私は「今」の部分に理解しています。 –

10

あなたはいつも巣クエリ可能性1つのクエリに追加します。正しい結果が得られているようだ

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID into g 
      select g.First(); 

編集

実際には、あなたがこれを下に簡素化することができます。

2
var finalList = list 
    .GroupBy(c => c.ID) 
    .Select(g => g.OrderByDescending(c => c.AddressPurpose).First()) 
    .ToList(); 
関連する問題