2016-07-11 6 views
5
내가 ID, ContactID가 다음과 같은 간단한 테이블이

에서 마지막 레코드를 선택하는코멘트.어떻게 LINQ GROUPBY 절

enter image description here

나는 기록과 GroupBy contactId을 선택합니다.

Mains.GroupBy(l => l.ContactID) 
.Select(g => g.FirstOrDefault()) 
.ToList() 

그것은 기록 14을 반환 :이 LINQ 확장 메서드 문을 사용했다. LINQ을 사용하여 ID이 가장 높은 ContactID을 얻으려면 어떻게해야합니까?

답변

11

당신은 그룹의 항목에 당신에게 항목

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 
5

사용 OrderByDescending을 주문할 수 있습니다 (즉 3 돌아가 6) : 또한

Mains.GroupBy(l => l.ContactID) 
    .Select(g => g.OrderByDescending(l => l.ID).First()) 
    .ToList(); 

, FirstOrDefault 필요을 선택이 없다 그룹의 항목; 그룹에는 항상 하나 이상의 항목이 있으므로 First()을 안전하게 사용할 수 있습니다.

1

OrderByDescending

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 

은 최고의 솔루션 이름에서 꽤 분명 가장 높은 ID의 하강에 의해

그것은 주문이다.

var grouped = Mains.GroupBy(l => l.ContactID); 
var ids = grouped.Select(g => g.Max(x => x.Id)); 
var result = grouped.Where(g => ids.Contains(g.Id)); 

내가 생각대로 될 수 있습니다 (이 테스트 될 필요가 있으므로이 내부에 만들어진 어떻게 잘 모르겠어요) Max 대신 OrderByDescending의와

3

아마도 선택은 성능 개선에 발생할 수 MAX을 가져 오는 쿼리에 넣은 다음 SELECT * FROM ... WHERE id IN ({max ids here})을 실행하면 OrderByDescending보다 훨씬 빠릅니다.

내가 옳지 않다면 언제든지 저를 시정 해주십시오.