2011-07-06 9 views
0

ActionId、uid &という3つの列のテーブルがあります。LINQを使用してグループ内の最新のエントリで行をグループ化する方が良い

アクションをuidでグループ化したいが、新しいアクションが(uidによる)グループに挿入されるたびに、グループが一番上にプッシュされ、そのグループ内の個々の行が順序付けされる。

これは私がSQLに思い付いたものです:

select * from actions as a 
inner join 
( 
    select aa.[uid], MAX(aa.[created]) as maxcreated 
    from actions as aa 
    group by aa.[uid] 
) as a2 on a2.uid = a.uid 
order by a2.maxcreated desc, a.created desc 

は、LINQでこれを行う方法もその後、SQLでこれを達成するためのより良い方法はあります、と?

+0

グループ化または注文していますか?グループ化とは、グループ化に基づいた集計データ(count()、sum()、avg())を取得することを意味します。 – Narnian

+0

@Narnian - Uidに対して効果的にグループ化しますが、グループ内の最新の日付に基づいてグループを順序付けします。 uidフィールドがthreadIdのようなもので、アクションがスレッドにグループ化されているとします。アクションをスレッドグループで一緒に表示したいのですが、アクションが挿入されるたびに、同じuidを持つグループが先頭にプッシュされます。 – jaffa

答えて

0

したがって、各グループを社内で注文し、グループを最新の値で注文しますか?さて、私たちはそれを行うことができると思う... SQLの場合

var query = from action in actions 
      group action by action.Uid into g 
      orderby g.Max(action => action.Created) descending 
      select new { Uid = g.Key, 
         Actions = g.OrderByDescending(action => action.Created) }; 

foreach (var group in query) 
{ 
    Console.WriteLine("Uid: {0}", group.Uid); 
    foreach (var action in group.Actions) 
    { 
     Console.WriteLine(" {0}: {1}", action.Created, action.ActionId); 
    } 
} 
+0

甘い!それは事実、私のt-SQL文と同じことをしていますか?私が試してみて、それを私のt-SQLの頭部に作り直してみると少し違っているようです) – jaffa

+0

@jaffa:おそらく: –

0

SELECT *, (SELECT MAX(created) FROM actions a2 where a.uid = a2.uid) AS MaxCreated 
FROM actions a 
ORDER BY MaxCreated desc, a.created desc 

または

SELECT * 
FROM actions a 
ORDER BY (SELECT MAX(created) FROM actions a2 where a.uid = a2.uid) desc, a.created desc 

は(単にエラーを修正し、SELECT文でソート列を取得します最初のクエリで)

私のlinqです:

var actions = (from a in actions     
       orderby ((from a2 in actions 
         where a2.UserID == a.UserID 
         select a2.created).Max()) descending, a.created descending 
       select a); 
+0

どちらの方が好きですか?そしてLINQのバージョンはありますか?私はJon Skeetのバージョンと比較できますか? – jaffa

+0

いずれかがうまくいくはずです。 2番目はMaxCreatedを結果から除外しますので、これが望ましいかもしれません。 – Narnian

関連する問題