簡體   English   中英

在EF4中將Sql Pivot表查詢轉換為linq

[英]Convert Sql Pivot table query to linq in EF4

最近三天我一直在做一項任務。 我嘗試將一個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查詢中,我未能按小時進行分組!

誰可以幫我這個事??

放棄。 EF沒有設置用於運行數據透視查詢的工具,即使您以某種方式設法做到這一點,查詢的性能也將很糟糕。 無需嘗試將SQL查詢轉換為Linq查詢,只需創建具有與查詢結果集同名的屬性的類:

public class HoursPerDay {
    // if you want different names you must use aliases in your query too
    public string project_name { get; set; } 
    public int SUNDAY { get; set; }
    public int MONDAY { get; set; }
    public int TUESDAY { get; set; }
    public int WEDNESDAY { get; set; }
    public int THURSDAY { get; set; }
    public int FRIDAY { get; set; }
    public int SATURDAY { get; set; }
}

並使用objectContext.ExecuteStoreQuerydbContext.Database.SqlQuery

var data = dbContext.Database.SqlQuery<HoursPerDay>(yourSqlQuery);

得出簡單的結論:Linq-to-entities最終不會替代SQL。 使用實體框架時,SQL仍然是補充工具。

正如Ladislav(以及我自己的經驗)所說:在sproc中進行數據透視要比在客戶端執行數據效率高得多。 但是您可能有理由不這樣做。 無論如何,我想我知道問題出在哪里。 您不應將小時數包括在分組中:

group sourceQuery by new { sourceQuery.project_name, sourceQuery.personnel_name,
                           sourceQuery.report_date } into pvt

結果集中的語句保持不變:

...
Sunday = (EntityFunctions.DiffDays(firstSunday, pvt.Key.report_date.Value) % 7
         == 0 ? pvt.Sum(g => g.hours) : 0),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM