別のLINQピボットの問題-SQLスクリプトをLINQに変換する
質問
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),
};
所属していません StackOverflow