2016-04-11 4 views
4

を選択以下のデータ

ClientID | Amount 
---------+------- 
000021354| 200 
000021353| 300 
000021353| 400 
000021352| 100 
000021351| 200 
000021350| 100 

コード:

List<Client> cList = new List<Client>(); 
cList.Add(new Client() { ClientID = "000021354", Amount = 200 }); 
cList.Add(new Client() { ClientID = "000021353", Amount = 300 }); 
cList.Add(new Client() { ClientID = "000021353", Amount = 400 }); 
cList.Add(new Client() { ClientID = "000021352", Amount = 100 }); 
cList.Add(new Client() { ClientID = "000021351", Amount = 200 }); 
cList.Add(new Client() { ClientID = "000021350", Amount = 100 }); 

私はそれが売上アップクライアントIDとSumによってグループ化することにしたいです。

ClientID | Amount 
---------+------- 
000021353| 700 #1 (300 + 400) 
000021354| 200 #2 
000021351| 200 #3 
others | 200 // (000021352 + 000021350) 

しかし、どういうわけか、私のグループ化は動作しません:

残りだから結果がでなければなりませんint型「その他」

をグループ化する必要があります - トップ3(最も売上高のクライアント)を選択する必要があります

var Grouped = cList.GroupBy(x => x.ClientID) 
       .OrderByDescending(x => x.Select(y=> y.Amount).Sum()) 
       .Select(x => x).Take(3); //how to add "others" ? 
+0

現在入手している結果は何ですか? –

+0

「どういうわけか私のグループはうまくいかない」とはどういう意味ですか?コンパイラエラーが出ますか?実行時の例外ですか?予想外の結果ですか? – Rik

+0

@Rik - 予期せぬ結果とその「その他」の追加方法がわかりません – Byyo

答えて

3

私はClientのグループ分けではないリストを返します。この

var grouped = a.GroupBy(x => x.ClientID, y => y.Amount) 
       .Select(x => new Client { ClientID = x.Key, Amount = x.Sum() }) 
       .OrderByDescending(x => x.Amount); 

var final = grouped.Take(3).ToList(); 
final.Add(new Client { ClientID = "Others", Amount = grouped.Skip(3).Sum(x => x.Amount) }); 
1
var grouped = cList.GroupBy(x => x.ClientID) 
        .Select(g => new { Id = g.Key, TotalAmount = g.Sum(c => c.Amount)}) 
        .OrderByDescending(x => x.TotalAmount); 

var result = grouped.Take(3).ToList(); 
result.Add(new {Id = "others", TotalAmount = grouped.Skip(3).Sum(x => x.TotalAmount)}); 
0

これは動作します:

 var Grouped = (from Group in (from client in clients 
             group client by client.Id into clientGroup 
             select new { Id = clientGroup.Key, Sum = clientGroup.Sum(cc => cc.Amount) }) 
         orderby Group.Sum descending 
         select Group).Take(3).ToList(); ; 
     var Top3 = Grouped.Take(3).ToList(); 
     var Others = Grouped.Skip(3).ToList(); 

"その他"をリストにする場合は、それ以外の場合は、最後の行を次のように変更します。

var Others = Grouped.Skip(3).Sum(g => g.Sum); 

1

あなたが必要とすること私はあなたが最初にグループを行う必要があり、後であなたが期待している結果を作成する必要があると思います。

var query=cList.GroupBy(x => x.ClientID) 
       .Select(g=>new{UserId=g.Key, Amount=g.Sum(y=>y.Amount)}) 
       .OrderByDescending(e=>e.Amount); 

var result= query.Take(3).Concat(new[]{new {UserId="others", Amount=query.Skip(3).Sum(e=>e.Amount)}}); 

PS:私は、私はそれがエンティティへのLINQだと思ったので、私のクエリを投影する匿名型を使用していますが、上記表示さのようなリストで作業している場合、あなたはあなたのClientクラスの上に投影することができ

+0

これもうまくいきます。 – Byyo

+1

@Byyo、このアプローチでは、結果を反復処理するか、またはToList拡張メソッドを呼び出すまで、この方法ではクエリが実現されません。実行 – octavioccl

0

覚えておいてくださいGroupByようなものでいいと思います。グループ化をリストに簡単に投影できます(この場合は匿名オブジェクトを使用します)。

var clients = cList.GroupBy(x => x.ClientID) 
        .Select(x => new { ClientID = x.Key, AmountTotal = x.Sum(c => c.Amount) }) 
        .OrderByDescending(x => x.AmountTotal); 

var topThree = clients.Take(3); 
var others = clients.Except(topThree); 
関連する問題

 関連する問題