我有下面的SQL语句,可以按预期/期望工作.但是我想将它翻译成LINQ语句(Lambda ??),以便它适合我的其余DAL.但是我无法弄清楚如何在LINQ中模拟Rank().
我在这里发布它的原因,可能是错误的,是看看是否有人有一个替代Rank()声明,以便我可以切换.或者,如果有一种方法Rank()在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 …Run Code Online (Sandbox Code Playgroud) 假设我想按国家/地区对客户数据库进行排名.在SQL中我会写:
select CountryID, CustomerCount = count(*),
[Rank] = RANK() over (order by count(*) desc)
from Customer
Run Code Online (Sandbox Code Playgroud)
现在我想在Entity Framework中写这个:
var ranks = db.Customers
.GroupBy(c => c.CountryID)
.OrderByDescending(g => g.Count())
.Select((g, index) => new {CountryID = g.Key, CustomerCount = g.Count, Rank = index+1});
Run Code Online (Sandbox Code Playgroud)
这有两个问题:
System.NotSupportedException; 显然,没有SQL转换的重载.Select()使用行号; .ToList()为了能够调用这个方法,你必须将所有内容都拉入内存中; 和RANK()SQL中的函数那样处理相同的排名,即它们应该具有相同的排名,然后下面的项目跳到原始顺序.那我该怎么做呢?
我在SQL Server中有一个表,其中包含以下列
我想按日期和时间订购数据,然后按DayOfWeek和Time订购数据.因此,所有带日期的记录都显示在顶部,按时间排序,然后是按时间排序的DayOfWeek.
我已经尝试了几种方法,但只是无法理解它,我有以下代码
var qry = ctx.DestinationTimings.Where(x => x.DestinationID == this.ID)
.OrderBy(t => t.Date).ThenBy(t => t.Date != null)
.ThenBy(t => SqlFunctions.CharIndex(t.DayOfWeek + ",", "MON,TUE,WED,THU,FRI,SAT,SUN"))
.ThenBy(t => t.Time);
Run Code Online (Sandbox Code Playgroud) 如何在linq语句中增加索引值.
int headIndex = -1;
// int itemIndex = -1;
lst = (from xx in db.vwCustomizationHeaders
where xx.ProductID == pID
select new custHeader()
{
headIndex = headIndex++,// Guid.NewGuid(),
}
Run Code Online (Sandbox Code Playgroud)