2009-11-09 3 views
0

나는 linq에서 groupby를하려고 애 쓰고있다. 기본적으로리스트를 가지고있다.LINQ : Groupby를 이해하고 실행하여 고유 한 행을 다시 가져 옵니까?

항목은 그래서 따라서 50 그렇게 포드 몬데오는

내 쿼리, 더 (아직 :-)) 아주 간단 조인되지만 50 포드 몬데오 등의 목록을 다시 제공, 내가 그것을 원하지 않았다

가있는 차량입니다 그들을 그룹화하여 단지 1 개의 엔트리 만 있도록합니다.

설명 만 선택하고 ID가 다른 ID를 선택하지는 않습니다.하지만 LinqPad에서 desc를 반환하고 편지의 설명 - 편지에서 모두 동일한 50 개의 ford mondeos를 볼 수 있습니다.

내가 뭘 잘못하고 있니?

from v in dc.Vehicles 
    group v by v.Description into g1 
from y in g1 
    orderby y.Description 
select new 
{ 
    Desc = y.Description 
}; 

편집이

그것은 지금이이 일을 위해 내 테스트했다, 각 포드 몬데오 단지 한 기록을 찾아온다하지만 난 이것에 확장해야 다시는 다시 한 기록을 가지고해야 나는 그들이 모든 문, categor, 모델 번호 등의 같은 번호가 확인 것처럼 포드 몬데오 각 있습니다 .. 물론

from v in dc.Vehicles 
    group v by v.Description into g1 
orderby g1.Key 
    select new 
    { 
    Desc = g1.Key, 
    CategoryId = g1.CategoryId, 
    MakeId = g1.MakeId, 
    ModelId = g1.ModelId, 
    Doors = g1.Doors, 
    }; 

위는 다른 모든 필드는 카테고리 ID를 즉 찾을 수없는 작동하지 않습니다 ... 나는 gr을 분리하려고했다. oup하여 다른 필드에 쉼표를 추가하십시오.

키가 약간 혼란 스럽 습니다만 이것이 키라는 것을 이해합니다. 그러나 1 개 이상의 필드를 그룹화하면 잠재적으로 더 많은 것을 가질 수 있습니다 1 키보다 ..

아이디어가 있으십니까?

답변

4

두 번째 "사용 중"으로 문제가 발생했습니다. 이 시도 :

from v in dc.Vehicles 
group v by v.Description into g1 
orderby g1.Key 
select new 
{ 
    Desc = g1.Key 
}; 

개념적으로,이 같은 그룹은 "시퀀스 순서"로 구성 - 해당 그룹과 일치하는 모든 항목들과 함께, 그룹 당 하나 개의 서브. 각 하위 시퀀스에는 키가 있습니다.이 경우 설명입니다.

"from"절은 기본적으로 "각 그룹에 대해 그룹의 모든 요소를 ​​가져옵니다."- 효과적으로 그룹을 다시 그룹화합니다. 일반적으로 그룹에 대해 일종의 집계를 수행합니다. 마지막 부분 :

select new 
{ 
    Desc = g1.Key, 
    Oldest = g1.Min(x => x.Date), 
    Newest = g1.Max(x => x.Date) 
}; 

편집 : 익명 형식은 다음 키를 형성합니다

group v by new { v.Description, v.Doors, v.Model } into g1 

한다 : 하나 개 이상의 필드 그룹에 익명 형식을 사용합니다.

을 얻으려면 기록 내의 필드, 당신은 시도 할 수 :

새로운 선택 {. 무작위 장 = g1.First() 무작위 장, 설명 = g1.Key을 // 등 }

논리적으로 하위 시퀀스의 첫 번째 레코드를 사용합니다.LINQ to SQL에서 작동하는지 여부는 알 수 없습니다. LINQ to Object에서 알 수 있지만, SQL과 동일한 것은 무엇인지 모릅니다. 이 작동하더라도이 작동하면 엄청나게 비쌉니다. 익명 형식을 통한 복합 키로 그룹화하면 여기에 갈 수있는 방법이라고 생각합니다.

+0

감사합니다 존, 큰 도움! .이 훌륭한 일을, 그것은 모든 포드 mondeos에 대한 1 기록을 가져 오면, 난 완전히 키를 이해하지 않지만 SQL에서 Linq에서 1 필드보다 내 그룹화 할 수 있습니까? 그렇다면 핵심은 무엇입니까? 내가하는 일을 보여주기 위해 내 질문을 업데이트 할 것입니다. –

+0

질문 업데이트 –

+0

나는 이것을 작동시키지 않았지만 이것이 최선의 방법인가요? 선택 내에서 선택 ?? CategoryId = g1.Select (x => x.CategoryId). 나는 그것이 작동했음을 인정해야한다. 그래서 나는 grouping으로 필드를 가져 오기 위해 select 메서드를 호출해야만한다 ?? 그리고 당연히 5 dorrs와 1로서 1 개의 mondeo가 4 개의 문을 가지고 있지만 같은 기술을 가지고 있다면 - 나는 기술적으로 두 개의 레코드를 필요로 할 것입니다. 그것들은 서로 다르므로 여러분은 1 개 이상의 필드에서 그룹화 할 수 있어야합니다. 나는 아직도 SQL 세계에 머물러 있다고 생각한다 :-) !!! –

0

bys는 고유 한 행을 가져 오는 데 사용되지 않고 sum, avg, count 등과 같은 집계식이있을 때 열을 그룹화합니다.

+0

감사합니다. bpayne, 예. 약간의 오류가 있습니다. –

1

그냥 키를 사용하여 같은 것을 할 필요가 (당신이에 그룹화있는 필드)하려면 ...

from v in dc.Vehicles 
    group v by v.Description into g1 
select g1.Key; 
관련 문제