Convertir SQL Rank () a LINQ, o alternativa

Tengo la siguiente instrucción SQL que funciona según lo deseado / esperado. Sin embargo, me gustaría traducirlo a una declaración LINQ (Lambda ??) para que se ajuste al resto de mi DAL. Sin embargo, no puedo entender cómo simular Rank () en LINQ.

La razón por la que lo publiqué aquí, que tal vez sea un error, es para ver si alguien tiene una alternativa a laRank() para que pueda cambiar esto. Alternativamente, si hay una manera de representarRank() en LINQ que también sería apreciado.

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())
      )

Respuestas a la pregunta(8)

Su respuesta a la pregunta