2010-10-10 69 views
4

我有一個記錄用戶何時查看頁面的表格。該表看起來是這樣的:Linq to SQL:獲取連續日常視圖的數量

ID | Date 
1 | 01/01/10 00:00:01.000 
2 | 03/01/10 00:00:01.000 
3 | 03/01/10 00:00:02.000 
4 | 04/01/10 00:00:01.000 
5 | 05/01/10 00:00:01.000 
6 | 05/01/10 00:00:02.000 
7 | 05/01/10 00:00:03.000 

使用LINQ到SQL我要計算連續幾天一個網頁被瀏覽的最後一組,當然,我不知道我怎麼會去這樣做。例如,在數據運行上面的查詢應該返回3.

任何幫助將長久地感謝:)

+0

難道你不想返回7不是3? – codingbadger 2010-10-10 09:53:01

+0

我明顯在連續幾天之後,連續幾天沒有多少記錄。 – ajbeaven 2010-10-10 10:01:33

+0

啊是的 - 抱歉,我誤解了你的問題。 – codingbadger 2010-10-10 10:02:42

回答

2

這是測試數據。我在列表末尾添加了10月6日,以確保結果只會選取最後連續的日期集。

List<DateTime> viewDates = new List<DateTime>(); 
viewDates.Add(new DateTime(10, 10, 1)); 
viewDates.Add(new DateTime(10, 10, 3)); 
viewDates.Add(new DateTime(10, 10, 3)); 
viewDates.Add(new DateTime(10, 10, 4)); 
viewDates.Add(new DateTime(10, 10, 5)); 
viewDates.Add(new DateTime(10, 10, 5)); 
viewDates.Add(new DateTime(10, 10, 5)); 
viewDates.Add(new DateTime(10, 10, 6)); 



首先,我們需要找出最後連續日期:

var lastConsecutiveDate = viewDates 
       .Distinct() 
       .Reverse() 
       .SkipWhile(distinctDate => viewDates.Where(viewDate => (viewDate.Date == distinctDate.Date)).Count() < 2).FirstOrDefault(); 



我們有兩個選擇這裏,使用foreachLINQ?與LINQ相比,foreach更具可讀性。我將顯示兩個實現。

這是foreach實現:

var consecutiveDates = new List<DateTime>(); 
foreach (var item in viewDates.Where(viewDate => viewDate <= lastConsecutiveDate).Distinct().OrderByDescending(a => a.Date)) 
{ 

    //break if datediff is not 1 
    int count = consecutiveDates.Count; 
    if ((count > 0) && (consecutiveDates[count - 1].Date.AddDays(-1) != item.Date)) 
    { 
     break; 
    } 

    consecutiveDates.Add(item); 
} 



這是LINQ的實施,以下可讀:

var consecutiveDates = viewDates 
    .Where(viewDate => viewDate <= lastConsecutiveDate) 
    .Distinct() 
    .OrderByDescending(viewDate => viewDate.Date) 
    .Aggregate 
    (
     new { List = new List<DateTime>() }, 
     (result, viewDate) => 
     { 
      int count = result.List.Count; 
      if ((count > 0) && (result.List[count - 1].Date.AddDays(-1) != viewDate.Date)) 
      { 
       return new { result.List }; 
      } 

      result.List.Add(viewDate); 
      return new { result.List }; 
     }, 
     a => a.List 
    ); 

Console.WriteLine(consecutiveDates.Count());將打印出 「3」。 我期待更多的代碼重構,但我休息了。

+0

此查詢與連續日無關,只是返回一天中的觀看次數。 – 2010-10-10 10:57:39

+0

哎..我誤解了提問者的問題。我編輯了我的代碼。 (-2是痛苦的..) – bla 2010-10-10 15:04:06

+0

我明白你的痛苦,我會很樂意改變我的投票,但你再次誤解了這個問題。正如OP在評論中所說的,他在連續天數之後*,而不是在lastConsecutiveDay中的觀看次數。它應該是獨特的東西,回覆,然後計算有多少天是連續的......我不知道如何與Linq做到這一點,但是你的解決方案仍然是關閉的。 – 2010-10-10 19:48:50