C# 另一个LINQ Pivot问题-将SQL脚本转换为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

关于LINQ枢轴,已经有几个问题了,虽然有几个问题概括了我的确切问题,但我无法成功地将它们转化为有效的解决方案。我觉得这主要是因为我的表中有一个连接

因此,为了所有喜欢解决问题的LINQ迷们的利益,这里有另一个难题需要你们解决。请通过将以下SQL存储的proc脚本转换为LINQ来帮助我(并从我那里获得一些声誉点数和更多尊重):

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),
      };