2014-10-29 16 views
1

我正在嘗試獲取SSRS曲線圖的數據集。我試圖顯示過去六個月每年每週的記錄數。爲了使折線圖準確無誤,我必須顯示幾周內沒有記錄。Linq Group by Week Number包括0個記錄周

我想提供的數據線圖看起來像這樣:

Year Week Count 
2014 52 13 
2015 1  0 
2015 2  16 

下面的LINQ查詢獲取具有零所記錄的一切,我需要減去周:

list = (from t in context.Cats.Where(
        t => t.Name == "Fluffy" && 
        (t.Recorded >= start && t.Recorded <= end) 
        ).AsEnumerable() 
         group t by new { Year = t.Recorded.Year, WeekNumber = (t.Recorded - new DateTime(t.Recorded.Year, 1, 1)).Days/7 } into ut 
         select new TrendRecord 
         { 
          Year = ut.Key.Year, 
          Week = ut.Key.WeekNumber, 
          Count = ut.Count() 
         }).OrderBy(t => t.Year).ThenBy(t => t.Week).ToList<TrendRecord>(); 

我我看了thisthis SO問題,但似乎都不適合我的困境。

我傾向於在開始和結束日期之間創建一個包含所有可能的星期編號的列表,然後以某種方式將我的數據加入到它中,以便顯示0條記錄。

這是一個可接受的方法來解決這個問題(請告訴我如何如何)?有沒有辦法在一個查詢中做到這一點,而不需要單獨的列表來加入?

+1

不是一個解決方案,而是一個對計算星期很重要的問題。你確定你想在1月1日的第一週開始計算一年中的幾周,而不是週日?它非常不尋常。正常情況下,每個星期都有一個特殊的工作日,每週開始計算,結果是一週與新的一年重疊。 – Fratyx 2014-10-29 20:52:29

+0

我知道我現在擁有它的方式會讓我的週數減少一些。雖然哈哈,但這是一個挑戰。這個折線圖實際上將成爲一個迷你圖,所以用戶不關心實際的星期數(因爲他們不會看到任何的軸)。至少目前來說,重要的是,sparkline包含過去六個月的數據,並且表示零記錄星期。因爲截止日期:-( – Bruno 2014-10-29 21:01:06

+1

創建一個星期列表和外連接(通過LINQ到對象)是要走的路。 – 2014-10-29 21:11:05

回答

1

您將需要一個星期的列表,並使用Linq做某種左外連接(LEFT OUTER JOIN)。

像這樣的東西應該幫助你開始

var weeks = new[] 
    { 
     new {Year = 2014, Week = 52}, 
     new {Year = 2015, Week = 1}, 
     new {Year = 2015, Week = 2}, 
    }; 

    var listWithEmptyWeeksIncluded = 
     from w in weeks 
     from l in list.Where(x => x.Year == w.Year && x.Week == w.Week).DefaultIfEmpty() 
     select new TrendRecord 
        { 
         Year = w.Year, 
         Week = w.Week, 
         Count = l == null ? 0 : l.Count 
        }; 

當然,周應的變量爲基礎startend

而且上產生的,你應該使用一個標準的一週計算中例如ISO周標準,以便正確處理兩年的週期。