2011-02-16 5 views
5

이렇게하려면 한 줄짜리가 있어야합니다. 찾을 수 없습니다. 항목을 그룹화하고 LINQ가있는 각 그룹의 특정 항목을 선택

이 쿼리를 감안할 때 :

from x in new XPQuery<XPContent>(s) 
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date } 

내가 각각 별개의 콘텐츠 ID에 대한 가장 큰 날짜와 함께 기록을 선택해야합니다. LINQ로 영리하게 할 수 있습니까? 지금 나는 이것을하고있다 :

var q = (from x in new XPQuery<XPContent>(s) 
      select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }).ToList(); 

var r = q.ToLookup(item => item.ContentID); 
foreach (var rItem in r) { 
    var s = rItem.OrderByDescending(a => a.Date).First(); 
    /* do stuff with s */ 
} 

... 그러나 ToLookup은 어색해 보인다. 아니면 (가장 간단한) 솔루션이 있습니까?

또한 ToList를 사용하지 말아야한다는 것을 알고 있지만 당분간은 무시하십시오.

미리 감사드립니다.

답변

6

난 당신이 원하는 생각 :

var q = from x in new XPQuery<XPContent>(s) 
     group x by x.ContentID into g 
     let latest = g.OrderByDescending(a => a.Date).First() 
     select new 
     { 
      latest.Category, latest.ContentType, 
      latest.Name, latest.ContentID, latest.Date 
     }; 

(. MaxBy 연산자 예를 들어, 먼저 정렬하여보다 그룹에서 '최대'요소를 찾는 더 성능이 좋은 방법이 있다는 것을 참고를 수행)

쿼리가 매우 간단합니다. 아이템을 그룹화하여 단지 ContentId으로 그룹화 한 다음 각 그룹에서 그룹의 최신 항목에서 생성 된 익명 유형의 인스턴스를 선택합니다.

+2

'알겠습니다'라는 것을 결코 알지 못했습니다 - 감사합니다! –

관련 문제