2011-07-06 1 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

둘 중 하나가 작동해야합니다. 두 번째 것은 결과에서 MaxCreated를 유지하므로 바람직 할 수 있습니다. – Narnian

관련 문제