C# 另一个LINQ Pivot问题-将SQL脚本转换为LINQ
关于LINQ枢轴,已经有几个问题了,虽然有几个问题概括了我的确切问题,但我无法成功地将它们转化为有效的解决方案。我觉得这主要是因为我的表中有一个连接 因此,为了所有喜欢解决问题的LINQ迷们的利益,这里有另一个难题需要你们解决。请通过将以下SQL存储的proc脚本转换为LINQ来帮助我(并从我那里获得一些声誉点数和更多尊重):C# 另一个LINQ Pivot问题-将SQL脚本转换为LINQ,c#,asp.net,sql,linq,pivot,C#,Asp.net,Sql,Linq,Pivot,关于LINQ枢轴,已经有几个问题了,虽然有几个问题概括了我的确切问题,但我无法成功地将它们转化为有效的解决方案。我觉得这主要是因为我的表中有一个连接 因此,为了所有喜欢解决问题的LINQ迷们的利益,这里有另一个难题需要你们解决。请通过将以下SQL存储的proc脚本转换为LINQ来帮助我(并从我那里获得一些声誉点数和更多尊重): ALTER PROCEDURE [dbo].[GetTimesheetForWeekById] @timesheetid int, @begindate
ALTER PROCEDURE [dbo].[GetTimesheetForWeekById]
@timesheetid int,
@begindate VarChar(20),
@enddate VarChar(20)
AS
BEGIN
SELECT T.TaskName,
SUM(
case DATEPART(weekday, TE.StartTime)
WHEN 1 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Sunday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 2 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Monday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 3 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Tuesday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 4 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Wednesday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 5 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Thursday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 6 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Friday,
SUM(
case DATEPART(weekday, TE.StartTime)
when 6 THEN DATEDIFF(minute, TE.StartTime, TE.EndTime) ELSE 0 END
) AS Saturday
FROM Tasks T
INNER JOIN TimeEntries TE on T.TaskID = TE.TaskID
WHERE TE.StartTime BETWEEN
(CONVERT(datetime, @begindate, 103)) AND (CONVERT(datetime, @enddate, 103))
AND TE.TimesheetID = @timesheetid
GROUP BY T.TaskName
END
假设外键有一个对象表示,比如:
int timesheetId = ...
DateTime start = ..., end = ...
var qry = from timeEntry in ctx.TimeEntries
let date = timeEntry.StartTime.Date
where timeEntry.TimesheetId == timesheetId
&& date >= start
&& date <= end
group timeEntry by timeEntry.Task.TaskName into grp
select new {
TaskName = grp.Key,
Monday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Monday).Count(),
Tuesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Tuesday).Count(),
Wednesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Wednesday).Count(),
Thursday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Thursday).Count(),
Friday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Friday).Count()
};
int timesheetId=。。。
日期时间开始=…,结束=。。。
var qry=从ctx.TimeEntries中的timeEntry开始
让date=timeEntry.StartTime.date
其中timeEntry.TimesheetId==TimesheetId
&&日期>=开始
&&date x.StartTime.DayOfWeek==DayOfWeek.Monday).Count(),
星期二=grp.Where(x=>x.StartTime.DayOfWeek==DayOfWeek.周二).Count(),
星期三=grp.Where(x=>x.StartTime.DayOfWeek==DayOfWeek.周三).Count(),
星期四=grp.Where(x=>x.StartTime.DayOfWeek==DayOfWeek.星期四).Count(),
Friday=grp.Where(x=>x.StartTime.DayOfWeek==DayOfWeek.Friday).Count()
};
不幸的是,有些细节取决于SQL提供程序,即哪些函数(如DayOfWeek等)可以成功映射为TSQL。如果您遇到问题,请告诉我…这是怎么回事(修改Marc的):
var qry=timeEntries中的from timeEntry
让date=timeEntry.StartTime.date
其中timeEntry.TimesheetId==TimesheetId
&&日期>=开始
&&date x.StartTime.DayOfWeek==DayOfWeek.Monday)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
星期二=grp.Where(x=>x.StartTime.DayOfWeek==星期二)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
星期三=grp.Where(x=>x.StartTime.DayOfWeek==星期三)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
星期四=grp.Where(x=>x.StartTime.DayOfWeek==星期四)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
Friday=grp.Where(x=>x.StartTime.DayOfWeek==DayOfWeek.Friday)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
};
当然!只有一个问题-我需要一周中每一天的总数,而不是计数。但这肯定是答案,但有一个例外。下一条注释包含exception.System.Collections.Generic.IEnumerable不包含“Sum”的定义,最好的扩展方法重载“System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable)”有一些无效的论点,严重的问题是要从档案中挖掘这个问题。今晚我会看一看,因为我正在玩一些相关的功能。哈哈,我以为这是一个新的。我没有注意到日期。。。。不知怎的,它突然出现在我眼前,我只是想尝试解决它。
var qry = from timeEntry in timeEntries
let date = timeEntry.StartTime.Date
where timeEntry.TimesheetId == timesheetId
&& date >= start
&& date <= end
group timeEntry by timeEntry.Task.TaskName into grp
select new
{
TaskName = grp.Key,
Monday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Monday)
.Sum(x=>x.EndTime.Subtract(x.StartTime).TotalMinutes),
Tuesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Tuesday)
.Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
Wednesday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Wednesday)
.Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
Thursday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Thursday)
.Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
Friday = grp.Where(x => x.StartTime.DayOfWeek == DayOfWeek.Friday)
.Sum(x => x.EndTime.Subtract(x.StartTime).TotalMinutes),
};