2011-01-31 51 views
3

我有以下查詢返回給定日期每天的登錄計數。快速linq計數問題

var sot = from uts in DataContext.UserTrackingStatistics 
       let startDate = new DateTime(2009, 10, 01) 
       where uts.LastLogin >= startDate 
       group uts by uts.LastLogin.Date into myGroup 
       orderby myGroup.Key.Date 
       select new { Count = myGroup.Count() , myGroup.Key.Date}; 

我想這是說,在給定的一天計數爲0,而不是返回任何東西。我怎麼能在這個查詢中做到這一點?

回答

5

你不能用LINQ到SQL來完成它,因爲你必須在查詢中使用union,而實際上並不存在的數據是LINQ-to-SQL無法做到的。

要做到這一點,您需要填寫客戶端的差距。我現在不是在VS面前,但一般的做法是這樣的:

  1. 定義你的日期範圍(因爲你在代碼中沒有提到結束日期,我們正在談論登錄日期,我假設結束日期是當前日期
  2. 使用Enumerable.Range可以創建一個範圍從0到日期範圍內的天數的數字列表,然後使用Select將該列表轉換爲日期列表。選擇使用匿名類型的結果,並使用相同的屬性,你的L2S陳述;這樣一來,編譯器會重複使用相同類型
  3. 結合您的列表一起使用外連接(不是最Ô在Date財產
  4. 訂購bvious語法LINQ,不幸)你的結果按日期

現在,這將爲空白顯示爲0。

我會嘗試後下一個代碼示例,但請注意,我不能編譯我在哪裏,所以它可能需要調整。

var allDates = Enumerable.Range(0, (DateTime.Today - startDate).TotalDays) 
       .Select(i => new { Count = 0, Date = startDate.AddDays(i) }); 

var fullResults = from d in allDates 
        join r in results on d.Date == r.Date 
        from oj in r.DefaultIfEmpty() 
        select new { Count = oj == null ? 0 : oj.Count, Date = d.Date }; 
+0

+1使用Enumerable.Range加入到間隙。 – 2011-01-31 21:15:16