c# - 另一个 LINQ Pivot 问题——将 SQL 脚本转换为 LINQ

标签 c# asp.net sql linq pivot

SO 上已经有一些关于 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

最佳答案

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

        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 提供程序 - 即哪些函数(如 DayOfWeek 等)可以成功映射为 TSQL。如果您遇到问题,请告诉我...

关于c# - 另一个 LINQ Pivot 问题——将 SQL 脚本转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/348900/

相关文章:

c# - 使用控制台应用程序组织第三方库的最佳方式

c# - 在 GridView 的绑定(bind)字段中显示多个数据字段

c# - 无法加载文件或程序集 'PayPalCoreSDK'

MySQL group by with MAX 没有按预期工作?

sql - 从 hive 中的兽人快照表中选择行

mysql - #1242 - 子查询在 mysql 中返回多于 1 行

c# - 包含已知可分配给整数变量的值的拆箱对象

c# - Context.Items 在页面刷新/传输期间清除

asp.net - 移动ASP.NET技术

c# - 根据文件夹结构对 url 字符串列表进行分组