2009-04-06 3 views
8

나는과 같이 데이터의 목록을 가지고 :편평 Linq는 그룹 쿼리

ID AddressPurpose Address ... 
1 L 
1 P 
2 L 
2 P 
3 P 
3 L 
4 P 
4 L 
5 P 
6 L 

내가 데이터를 필터링 할 수 있도록하려는 그래서 다음 다른 반환 된 P 행이있는 경우 각각의 고유 번호 L 행이 반환됩니다. 그래서 데이터는 다음과 같이 표시됩니다 순간

ID AddressPurpose Address ... 
1 P 
2 P 
3 P 
4 P 
5 P 
6 L 

를 내가 잘 작동이 쿼리가 : 여분의 foreach를 사용하지 않고이 할 수있는 더 나은 방법이

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID 
      into g 
       select g; 

var finalList = new List<Company>(); 
foreach (var list in query) 
{ 
    finalList.Add(list.First()); 
} 
return finalList; 

거기를?

var query = 
    from i in (
     from c in list 
     orderby c.AddressPurpose descending 
     group c by c.ID into g 
     select g) 
    select i.First(); 

return query; 

나는이 그것 (또는 어쩌면 최고의)을 할 수있는 유일한 방법은 아니다 확신하지만 당신의 "foreach는"을 마무리 않습니다

답변

3

selectg.First() 대신하지?

+0

필자가 직접 입력 한 내용 인 lc를 입력 했으니 까? +1! –

+0

그렇게 생각합니다. 나는 그들이 당신이 복잡한 쿼리를 반복 할 필요가 재사용 언제있어, 너무 당신의 중첩 된 쿼리를 좋아한다. –

+0

감사합니다. 그건 잘된거야. 나는 이제 "into into"부분을 이해합니다. –

10

당신은 항상 중첩 쿼리 수 하나의 쿼리로 올바른 결과를 제공하는 것

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID into g 
      select g.First(); 

:

편집

사실, 당신은이를 단순화 할 수 있습니다.

2
var finalList = list 
    .GroupBy(c => c.ID) 
    .Select(g => g.OrderByDescending(c => c.AddressPurpose).First()) 
    .ToList();