복붙노트

[SQL] LINQ에 SQL 순위 () 변환, 또는 대체

SQL

LINQ에 SQL 순위 () 변환, 또는 대체

나는 같은 작품이 요구 / 기대하는 SQL 아래 문이있다. 그러나 나는 내 DAL의 나머지 부분과 맞 있도록 LINQ 문 (람다 ??)로 번역하고 싶습니다. 그러나 나는 LINQ의 순위 ()를 시뮬레이션하는 방법을 알아 내기 위해 볼 수 없습니다.

오류가 어쩌면이다 내가 여기에 게시하는 이유는, 사람이 그렇게 순위 () 문에 대한 대안이 있다면 나는이 전환 얻을 수 있는지입니다. () LINQ에 순위를 표현하는 방법이 정의되어있는 경우, 또한 이해 될 것이다.

USE CMO

SELECT      vp.[PersonID] AS [PersonId]
            ,ce.[EnrollmentID]
            ,vp.[FirstName]
            ,vp.[LastName]
            ,ce.[EnrollmentDate]
            ,ce.[DisenrollmentDate]
            ,wh.WorkerCategory

FROM  [dbo].[vwPersonInfo] AS vp
            INNER JOIN 
            (
                  [dbo].[tblCMOEnrollment] AS ce
                  LEFT OUTER JOIN
                        (
                              SELECT   *
                                          ,RANK()OVER(PARTITION BY EnrollmentID ORDER BY CASE WHEN EndDate IS NULL THEN 1 ELSE 2 END, EndDate DESC, StartDate DESC) AS whrank 
                              FROM  [dbo].[tblWorkerHistory]
                              WHERE WorkerCategory = 2
                        ) AS wh 
                              ON ce.[EnrollmentID] = wh.[EnrollmentID] AND wh.whrank = 1
            ) 
                  ON vp.[PersonID] = ce.[ClientID]

WHERE (vp.LastName NOT IN ('Client','Orientation','Real','Training','Matrix','Second','Not'))
AND (
            (wh.[EndDate] <= GETDATE())
            OR wh.WorkerCategory IS NULL
      ) 
AND (
            (ce.[DisenrollmentDate] IS NULL) 
            OR (ce.[DisenrollmentDate] >= GetDate())
      )

해결법

  1. ==============================

    1.여기 쇼 내가 Linq에에 순위를 () 시뮬레이션 얼마나하는 샘플입니다 :

    여기 쇼 내가 Linq에에 순위를 () 시뮬레이션 얼마나하는 샘플입니다 :

       var q = from s in class.student
                     orderby s.Age descending
                     select new { 
                         Name = s.name, 
                         Rank = (from o in class.student
                                 where o.mark > s.mark
                                 select o).Count() + 1 
                     };
    
  2. ==============================

    2.LINQ는하지만 쿼리 구문, 내장 순위 기능이 있습니다. 보통 하나 공급 순위 한 - 사용하는 경우 방법 구문 가장 LINQ의 기능은 두 가지 버전으로 제공됩니다.

    LINQ는하지만 쿼리 구문, 내장 순위 기능이 있습니다. 보통 하나 공급 순위 한 - 사용하는 경우 방법 구문 가장 LINQ의 기능은 두 가지 버전으로 제공됩니다.

    간단한 예 선택 만 다른 모든 학생, 결과로 생성 된 시퀀스 인덱스를 추가 :

    var q = class.student.OrderBy(s => s.studentId).Where((s, i) => i % 2 == 0)
    .Select((s,i) => new
    {
      Name = s.Name,
      Rank = i
    }
    
  3. ==============================

    3.당신이 순위를 시뮬레이션 할 경우에 당신은 LINQ 쿼리를 사용할 수 있습니다.

    당신이 순위를 시뮬레이션 할 경우에 당신은 LINQ 쿼리를 사용할 수 있습니다.

          var q = (from s in class.student
                    select new
                    {
                        Name = s.Name,
                        Rank = (from o in class.student
                                where o.Mark > s.Mark && o.studentId == s.studentId
                                select o.Mark).Distinct().Count() + 1
                    }).ToList();
    

    당신은 등으로 순서를 사용할 수 있습니다 :

          var q = (from s in class.student
                    orderby s.studentId 
                    select new
                    {
                        Name = s.Name,
                        Rank = (from o in class.student
                                where o.Mark > s.Mark && o.studentId == s.studentId
                                select o.Mark).Distinct().Count() + 1
                    }).ToList();
    

    그러나 명령에 의해이 쿼리에 문제가되지 않습니다.

  4. ==============================

    4.@Totero에서하지만 람다 구현과 답변을 기준으로합니다. 높은 점수는 더 높은 순위를 =.

    @Totero에서하지만 람다 구현과 답변을 기준으로합니다. 높은 점수는 더 높은 순위를 =.

    var rankedData = data.Select(s => new{
                        Ranking = data.Count(x => x.Value > s.Value)+1,
                        Name = s.Key,
                        Score = s.Value});
    

    이 입력의 경우 :

    { 100, 100, 98, 97, 97, 97, 91, 50 }
    

    이 출력을 얻을 것이다 :

  5. from https://stackoverflow.com/questions/9873962/converting-sql-rank-to-linq-or-alternative by cc-by-sa and MIT license