2012/09/04

【LINQ】匿名化した固まりをまるごとグループ化【C#】

 なんのこっちゃって感じのタイトルになってしまいましたが、ちょっとLINQでグループ化してたら気がついたことがあったのでメモっときます。…今開発でLINQばっかり書いてるんで記事もLINQが多くなっちゃいますね。
 さて本題ですが、自分今までLINQでグループ化するとき、(こういう言い方が正しいかはわかりませんが、)匿名化した固まりを要素単位まで分解してグループ化してたんですよって言うかそうしないとグループ化できないと思い込んでたんですよ。ところがたまたま固まりごとグループ化してみたらできちゃったんでびっくりってなわけです。どういうことかは以下のサンプルで。

データ
Users
Id
Name

Points
Id
UserId
Point

 見ての通り、UsersとPointsはIdとUserIdで連結可能であり、今回はIdとNameでグループ化し、Pointの合計を求めたいということにします。

今までコード
from p in 
    (from p in users
     join g in points
     on p.Id equals g.UserId
     select new 
     {
        users= p,
        points = g  
     })
group p by new
{
    p.users.Id,
    p.points.Name
} into g
select new
{
    g.Key.Id,
    g.Key.Name,
    Point = g.Sum(p.points.Point)    
}


新しいコード
from p in 
    (from p in users
     join g in points
     on p.Id equals g.UserId
     select new 
     {
        users = p,
        points = g  
     })
group p by p.users into g
select new
{
    g.Key.Id,
    g.Key.Name,
    Point = g.Sum(p.points.Point)    
}


 ちょっと、変化が少なすぎて分かりにくいかもしれませんが、IdとNameを指定してグループ化していたのをusersのみの指定でグループ化を済ましています。まぁグループ化の単位によっては全然使えなかったりするわけですが、頭の片隅には置いておこうと思った次第で…。

 う~ん、毎度このながらなんてセンスのないサンプルでしょうか…。あとテーブルって簡単に横並びにできんもんだろうか…、float組むのはさすがに面倒だし。

デル株式会社
pagetop