質問

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として正常にマッピングできるかです。問題が発生した場合はお知らせください...

他のヒント

これはどうですか(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),
      };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top