2012-10-05 68 views
0

我一直在做最後三天的一項任務。我嘗試將一個SQL查詢轉換爲基於「將列轉換爲行」的稱爲Pivot表的linq。將Sql數據透視表查詢轉換爲EF4中的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結果::

enter image description here

LINQ的結果::

enter image description here

我想,在我的LINQ查詢,我沒有通過小時做組!

任何人都可以幫助我嗎?

回答

1

放棄。 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仍然是補充工具。

+0

我已經取得了98%,只是沒有得到結果,因爲我有顯示爲SQL,當你比較我在圖像中顯示的輸出時,你會知道只有在linq查詢中有一些問題。我需要解決!這就是爲什麼我需要專業人士幫助完成它,所以這是全新的事情!這個查詢已經完成了旋轉! – sikender

0

正如拉迪斯拉夫(以及我自己的經驗)所說:在一個存儲過程中轉向比在客戶端更有效率。但你可能有理由不這樣做。無論如何,我想我知道問題是什麼。你不應該包括在分組的時間:

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),