2012-12-19 3 views
4

에 LINQ에서 수행하는 방법 : 는 SQL에 파티션을 통해 순위를 할 수있다, 나는 다음과 같은 구조를 갖는 XML 파일이 XML

<Entities> 
    <Request> 
     <ID> A1 </ID> <!-- Can be multiple records with same values --> 
     <Finance> 
      <StartDate> Some Date </StartDate> <!-- Unique per ID --> 
     </Finance> 
    <Request> 
    <Request> ... </Request> 
</Entities> 

같은 ID를 가진하지만 여러 요청이있을 수 있습니다 이러한 경우 StartDate는 요청마다 달라야합니다.

ID 당 최신 두 날짜를 추출해야합니다. 이 ID 및 startDate를 열 SQL 테이블이 있다면

, 나는 잘 작동 다음 쿼리를 사용하십시오 :

SELECT ID, StartDate 
FROM (SELECT ID, StartDate, RANK() 
      OVER (PARTITION BY ID ORDER BY StartDate DESC) rank 
     FROM Request) 
WHERE rank IN ('1','2') 

을하지만 XML 형식의 데이터를 가지고 최고의 내가 올 수 with ID, StartDate에 따라 데이터를 정렬했습니다. 나는 아직도 모든 ID에 대해 최신 날짜 두 개를 추출해야합니다. (2) 단지 나에게 데이터의 상위 2 라인을 가져올 것 테이크를 사용

var에 cafrequests =

from request in xdoc.Descendants("Request") 
orderby (int)request.Element("ID"), 
(DateTime)request.Element("Finance").Element("StartDate") ascending 
select new 
{ 
    ID = request.Element("ID"), 
    StartDate = request.Element("Finance").Element("StartDate"), 
}; 

는, ID 당 2 위로하지.

그래서 누구든지 LINQ에서 위의 SQL 문과 동일하다고 말할 수 있습니까? 저는 C#에서 루프와 조건문을 사용하여 XML을 구문 분석하고 관리하고 싶지 않습니다. LINQ (어제 읽었고 사용하기 시작한)에 대해 상당히 익숙합니다. 문서를 계속 읽으려고합니다.

답변

2

이 작동, 내가 그것을 테스트 :

 XDocument doc = XDocument.Load(@"Data.xml"); 

     var result2 = doc.Element("Entities") 
      .Elements("Request") 
      .GroupBy(key => key.Element("ID").Value, el => DateTime.Parse(el.Element("Finance").Element("StartDate").Value)) 
      .Select(el => 
       new 
       { 
        id = el.Key, 
        max2 = el.OrderByDescending(date => date).Take(2) 
       }); 
  • doc.Element("Entities") - 문서의 루트 요소입니다 법인이라는 요소가이 요소를 검색하는 또 다른 방법은 doc.Root
  • Elements("Request")을 것 얻는다 - 도착 엔티티의 자식 인 Request라는 요소들
  • GroupBy - SQL에서 GROUP BY과 다소 비슷한 방법으로, 첫 번째 매개 변수는 진행중인 요소입니다. (Request 요소의 자식 인 Finance 요소의 자식 인 StartDate 요소에서 DateTime을 구문 분석하는 요소 선택기 함수입니다.)
  • .Select(el => new...) - 메서드

     var result = from el in doc.Root.Elements("Request") 
            group DateTime.Parse(el.Element("Finance").Element("StartDate").Value) by el.Element("ID").Value into grouped 
            select new { 
             id = grouped.Key, 
             max2 = (from el in grouped 
               orderby el descending 
               select el) 
               .Take(2) 
            }; 
    
    : 그것은 여기

동일한 결과를 가져 오는 쿼리이다하지만 쿼리 구문 작성된 ID에 대한 높은 날짜가 ID 2 레코드를 보유 익명의 유형을 생성한다 (예를 들어 상기 방법 구문)

+0

이 코드 전체를 이해할 수는 없지만 작동합니다.감사합니다 :) –

+1

당신을 환영합니다, 기쁘게 도와 줘. 내가 몇 가지 설명과 쿼리 구문으로 작성된 예제를 추가, 어쩌면 그것은 쿼리에 무슨 일이 일어나고 있는지 명확히 :) –

1

Id로 그룹화하고 최근 날짜를 선택할 수 없습니까? 이 같은. 결과 집합 (cafrequests)에 ID 및 해당 날짜 목록을 가져 오는 경우

var result = cafrequests.GroupBy(x=>x.Id).Select(x=>new{ x.Key,Dates = x.OrderByDescending(y => y.StartDate).Select(y=>y.StartDate).Take(2)}).ToDictionary(x=>x.Key); 

이렇게하면 각 ID의 상위 2 개 날짜가 부여됩니다.

관련 문제