2010-07-26 2 views
1

아마이 충분히 설명 할 수 없지만, 여기 간다 ... :LINQ 그룹화 : 키 대신 행을 선택 하시겠습니까? 나는이 유사한 테이블이 <p></p>

Id | Foreign_Key_Id | A_Number | Some_Other_Info 
1  1    100   Red 
2  1    200   Blue 
3  1    300   Orange 
4  2    100   Green 
5  2    200   Yellow 
6  3    100   Brown 

내가 최대 싶어 "A_NUMBER" 이 테이블의 특정 "Foreign_Key_Id"에 대한 정보를 제공하지만 나머지 레코드도 반환하므로 "Some_Other_Info"열의 정보가 있습니다.

나는이 같은 쿼리를 통해이 작업을 수행 할 수 있습니다 발견했습니다 내가하는 기록을 아주 잘 모르겠습니다 만

from x in This_Table 
group x by x.Foreign_Key_Id into g 
let maxANumber = g.Max(x => x.A_Number) 
orderby maxANumber descending 
select g.Where(x => x.A_Number == maxANumber).First() 

:

from x in This_Table 
group x by x.Foreign_Key_Id into g 
orderby g.Max(x => x.A_Number) descending 
select g.Where (x => x.Foreign_Key_Id == g.Key).OrderByDescending (x => x.A_Number).First() 

편집 : 가능성 또는이보다 간결 쿼리를 하나의 Foreign_Key_Id가 동일한 "A_Number"값을 가진 두 개의 레코드를 가지고 있다면 (이것은 내가 참조하는 테이블에서 가능하다. 가장 최근의 레코드를 취할 필요가있다). 내가 믿는 내 예

는 반환 :

Id | Foreign_Key_Id | A_Number | Some_Other_Info 
3  1    300   Orange 
5  2    200   Yellow 
6  3    100   Brown 

그것이 내가 생각 해낸 것보다 더 빠른 쿼리 수 (쉬운 방식으로이 작업을 수행 할 수있는 방법이 있어야한다 보인다), 나는 단지 방법을 이해할 수 없다.

미리 감사드립니다.

답변

1

다음도 작동합니다. 당신은 그룹 내부에 주문할 수 있습니다 A_Number의이 동일한 가장 최근의 기록을 복용

from x in This_Table 
group x by x.Foreign_Key_Id into g 
select g.OrderByDescending(y => y.A_Number).First(); 

쿼리에 다른 OrderBy를 추가하는 것만 큼 간단합니다.

+0

감사합니다. 내 추한 솔루션보다 훨씬 간결합니다. – Ocelot20

관련 문제