【问题标题】:Another LINQ Pivot Problem - Convert SQL Script to LINQ另一个 LINQ Pivot 问题 - 将 SQL 脚本转换为 LINQ
【发布时间】:2008-12-08 08:09:49
【问题描述】:

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

因此,为了所有热爱问题的 LINQ 爱好者的利益,这里还有一个难题供您解决。请通过将以下 SQL 存储过程脚本转换为 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

【问题讨论】:

    标签: c# asp.net sql linq pivot


    【解决方案1】:

    好吧,假设外键有一个对象表示,类似于:

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

    不幸的是,某些细节取决于 SQL 提供程序 - 即它可以成功映射为 TSQL 的函数(如 DayOfWeek 等)。如果您遇到问题,请告诉我...

    【讨论】:

    • 绝对!只有一个问题 - 我需要一周中的每一天的总和而不是计数。但这绝对是答案,但对于那个例外。下一条评论包含异常。
    • System.Collections.Generic.IEnumerable 不包含“Sum”的定义和最佳扩展方法重载“System.Linq.Enumerable.Sum(System.Collections.Generic. IEnumerable)" 有一些无效参数
    【解决方案2】:

    怎么样(修改 Marc 的):

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

    【讨论】:

    • 好吧,从档案中挖掘出这个问题是很重要的。今晚我会看看它,因为无论如何我都在玩一些相关的功能。
    • 大声笑,我以为这是一个新的。我没有注意到日期......不知何故它突然出现在我的视野中,我只是想尝试解决它。​​
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多