2016-08-11 5 views
4

複数の列を取得する方法を探していましたが、SQLで1つだけグループ化して情報を見つけました。しかし、私はlinqでそれを行う方法を考え出すことができません。 linqで1つだけグループ化してすべての列を選択

I持って、次のおもちゃの例テーブル:

| Id | Message | GroupId | Date | 
|-------------------------------| 
| 1 | Hello | 1  | 1:00 | 
| 2 | Hello | 1  | 1:01 | 
| 3 | Hey  | 2  | 2:00 | 
| 4 | Dude | 3  | 3:00 | 
| 5 | Dude | 3  | 3:01 | 

そして私は(「日付」降順順序で)次のように明確なGroupIdを持つ行のすべての列を回復したいと思います:

| Id | Message | GroupId | Date | 
|-------------------------------| 
| 1 | Hello | 1  | 1:00 | 
| 3 | Hey  | 2  | 2:00 | 
| 4 | Dude | 3  | 3:00 | 

私は、そのグループIDを与えられた唯一のものである限り、グループ化された行(第1、第2 ...)からどの行が選択されるかは本当に気にしません。

私がこれまでに次のコードで出てきているが、それはすることになっている何をしていません。

List<XXX> messages = <MyRep>.Get(<MyWhere>) 
          .GroupBy(x => x.GroupId) 
          .Select(grp => grp.OrderBy(x => x.Date)) 
          .OrderBy(y => y.First().Date) 
          .SelectMany(y => y).ToList(); 

答えて

8

これはあなたにグループごとに1つのアイテム与える:あなたがしたい場合

List<dynamic> data = new List<dynamic> 
{ 
    new {ID = 1, Message = "Hello", GroupId = 1, Date = DateTime.Now}, 
    new {ID = 2, Message = "Hello", GroupId = 1, Date = DateTime.Now}, 
    new {ID = 3, Message = "Hey", GroupId = 2, Date = DateTime.Now}, 
    new {ID = 4, Message = "Dude", GroupId = 3, Date = DateTime.Now}, 
    new {ID = 5, Message = "Dude", GroupId = 3, Date = DateTime.Now}, 
}; 

var result = data.GroupBy(item => item.GroupId) 
       .Select(grouping => grouping.FirstOrDefault()) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 

//Or you can also do like this: 
var result = data.GroupBy(item => item.GroupId) 
       .SelectMany(grouping => grouping.Take(1)) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 

をその後、OrderByを制御する:グループはGUAあるので、 `FirstOrDefault`は` First`と置き換えできること

var result = data.GroupBy(item => item.GroupId) 
       .SelectMany(grouping => grouping.OrderBy(item => item.Date).Take(1)) 
       .OrderByDescending(item => item.Date) 
       .ToList(); 
+0

注意を少なくとも1つのアイテムを持っていた。 –

+0

@ギラード私はものをオーバーコンプリートしたように見えます....あなたは私の問題を解決するだけでなく、これらの例についていくつかの理解を提供しています!ありがとうございます – Tekerson

+0

@テッカーソン - あなたは非常に歓迎です:)おそらくまた[SOのドキュメントのlinqを見る](http://stackoverflow.com/documentation/c%23/68/linq-queries#t=201608111109444847305) - そこに'TakeMe'、 'OrderBy'について素敵なセクションです - それからたくさん学ぶことができます:) –

関連する問題