2012-10-30 60 views
0

我需要比較上週和兩週前用戶的分數。linq比較兩個日期之間的列數據

我有像這樣 成績表

user score subject  date   
2  10  math  21/10/2012 
2  5  science 23/10/2012 
2  5  math  16/10/2012 
2  9  science 15/12/2012 

我需要製作一個查詢,顯示上週的成績,以及它是否是從2周增加或減少前的得分

user score subject  date   increase/decrease 
2  10  math  21/10/2012  +5 
2  10  science 23/10/2012  -4 

日期列不需要包含在查詢中 我已經有了從上週到兩週前的周範圍的代碼。然而,我比較兩個日期卻遇到了麻煩。

DateTime date = DateTime.Now; 
DateTime startOneWeekAgo = date.AddDays(-7).Date.AddDays(-(int)date.DayOfWeek), 
     endOneWeekAgo = startOneWeekAgo.AddDays(7); 

DateTime startTwoWeeksAgo = startOneWeekAgo.AddDays(-7), 
     endTwoWeeksAgo = endOneWeekAgo.AddDays(-7); 

從s的成績,其中s.scoredate> = startOneWeekAgo & & s.scoredate < endOneWeekAgo

這導致。這是我到目前爲止所。幫助將不勝感激。

user score subject 
2  10 math 
2  5  science 

回答

1
DateTime beginningOfWeek = DateTime.Now.BeginningOfWeek(); 
DateTime twoWeeksAgo = beginningOfWeek.AddDays(-14); 
DateTime endOfLastWeek = beginningOfWeek.AddMilliseconds(-1); 

var query = from s in scores 
      where s.Date >= twoWeeksAgo && s.Date <= endOfLastWeek 
      orderby s.Date 
      group s by new { s.User, s.Subject } into g 
      select new 
       { 
        User = g.Key.User, 
        Subject = g.Key.Subject, 
        Date = g.Last().Date, 
        Diff = g.Last().Score - g.First().Score 
       }; 

因此,你總是選擇只有兩個最後得分(兩個星期前,一個星期前),你將有隻有兩個每個組中的記錄。

如果在數據庫中只有一週的結果,則差異將爲零,因爲組中的最後和第一個條目將相同。

您也可以使用一些DateTime擴展獲得本週初:

public static class DateExtensions 
{ 
    public static DateTime BeginningOfWeek(this DateTime date, 
          DayOfWeek firstDayOfWeek = DayOfWeek.Monday) 
    { 
     if (date.DayOfWeek == firstDayOfWeek) 
      return date.Date; 

     DateTime result = date.AddDays(-1); 

     while (result.DayOfWeek != firstDayOfWeek) 
      result = result.AddDays(-1); 

     return result.Date; 
    } 
} 

還有一件事 - 儘量避免在一次聲明幾個變量。

+0

謝謝他的回覆。它說LINQ不能識別Last()方法,這個方法不能被轉換成存儲表達式。 –

+0

@shinratensei Enumerable.Last方法有什麼問題? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.last.aspx –