私は過去 3 日間から 1 つのタスクを実行しています。1つのSQLクエリを、ピボットテーブルと呼ばれる「列を行に変換」に基づくlinqに変換しようとしています。
私のSQLクエリは以下の通りです。
SELECT project_name
,SUNDAY
,MONDAY
,TUESDAY
,WEDNESDAY
,THRUSDAY
,FRIDAY
,SATURDAY
FROM
(
SELECT project_name
,personnel_name
,DATENAME(dw, report_date) AS day_name
,SUM(hours) AS HOURS
FROM [TimeSheet]
INNER JOIN [ProjectMaster]
ON [TimeSheet].[project_id] = [ProjectMaster].[project_id]
INNER JOIN [Personnel]
ON [TimeSheet].[personnel_id] = [Personnel].[personnel_id]
WHERE report_date BETWEEN getdate() - 7 AND getdate()
GROUP BY project_name, personnel_name, DATENAME(dw, report_date)
) sourceQuery PIVOT (SUM(hours)
FOR day_name IN
(SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THRUSDAY,FRIDAY,SATURDAY)) AS pvt
これまでのところ、それをlinqに変換することは以下のとおりです!!!
var before = DateTime.Now.AddDays(-7);
DateTime firstSunday = new DateTime(1753, 1, 7);
var DayWiseTS = from TSList in objWPFEntities.Timesheets.Include("ProjectMaster").Include("Personnel")
where (TSList.report_date >= before && TSList.report_date <= System.DateTime.Now)
select new { TSList.ProjectMaster.project_name, TSList.Personnel.personnel_name, TSList.report_date, TSList.hours } into sourceQuery
group sourceQuery by new { sourceQuery.project_name, sourceQuery.personnel_name, sourceQuery.report_date, sourceQuery.hours } into pvt
select new
{
projectname = pvt.Key.project_name,
Sunday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 0 ? pvt.Sum(g => g.hours) : 0),
Monday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 1 ? pvt.Sum(g => g.hours) : 0),
Tuesday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 2 ? pvt.Sum(g => g.hours) : 0),
Wednesday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 3 ? pvt.Sum(g => g.hours) : 0),
Thrusday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 4 ? pvt.Sum(g => g.hours) : 0),
Friday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 5 ? pvt.Sum(g => g.hours) : 0),
Saturday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7 == 6 ? pvt.Sum(g => g.hours) : 0)
};
両方のクエリで結果が得られましたが、SQLでは必要に応じて完璧な結果が得られましたが、linqでは必要なデータをSQLとして取得していません。
SQL結果::
Linq の結果 ::
私のlinqクエリでは、時間ごとにグループ化できなかったと思います!!
誰でもこれで私を助けることができますか??