2017-02-15 233 views
0

我創建了一種使用日期(日,月,年)對數據進行分組的方法。LINQ如何按日期分組日期和月份和年份

這是我的代碼:

private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm) 
{ 

    var messages = GetMessagesByDateAndIU(sqm); 

    IEnumerable<StatsticsVm> messagesCountPerDay = 

     from year in Enumerable.Range(sqm.From.Year, sqm.To.Year - sqm.From.Year + 1) 
     from month in Enumerable.Range(1, 12) 
     from day in Enumerable.Range(1, 31) 
     let key = new { Year = year, Month = month, Day = day } 
     join message in messages on key 
     equals new 
     { 
      message.ObservationDateTime.Year, 
      message.ObservationDateTime.Month, 
      message.ObservationDateTime.Day 
     } into g 
     select new StatsticsVm() 
     { 
      Label = key.Day + "/" + key.Month + "/" + key.Year, 
      MessagesCount = g.Count() 
     }; 

    return messagesCountPerDay; 

} 

我的問題是:這種方法有一個bug,該bug是結果總是包含12個月,31天我想要的結果是一樣的過濾器。

例如,如果我只想從第1天到第15天的數據,我總是從第1天到第31天獲得小組。

注意:即使一天有0條消息,我也希望包含在我的過濾器中的所有日子。這已經在這個方法中完成了。

+0

你說要包括所有的日子,那麼爲什麼有所有的月份和日期的問題嗎? 「我希望結果與過濾器一樣」是什麼意思? –

+0

我的意思是我只想要(幾年,幾個月,幾天),即使這些日子裏沒有消息。並且這裏的錯誤是即使我的過濾器是從第3個月到第12個月,結果總是從第1個月到第12個月以及從第1天到第31天。我希望我現在說清楚。 –

+0

從一天到十三或三十一?這有點不清楚,你應該按照最小和最大月份的方法分最小和最大月份 – Tinwor

回答

0

好吧,我想我終於得到了你。

您的問題與您嘗試創建DateTime範圍的方式有關。

正確的方法是這樣的:

Enumerable.Range(0, 1 + sqm.To.Subtract(sqm.From).Days) 
      .Select(offset => sqm.From.AddDays(offset)) 

這會給你下面的代碼:

private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm) 
{ 

    var messages = GetMessagesByDateAndIU(sqm); 
    var dateRange = Enumerable.Range(0, 1 + sqm.To.Subtract(sqm.From).Days) 
           .Select(offset => sqm.From.AddDays(offset)); 

    IEnumerable<StatsticsVm> messagesCountPerDay = 
     from date in dateRange 
     join message in messages on date 
     equals message.ObservationDateTime into g 
     select new StatsticsVm() 
     { 
      Label = date.Day + "/" + date.Month + "/" + date.Year, 
      MessagesCount = g.Count() 
     }; 

    return messagesCountPerDay; 

} 
0

至於我可以看到你正在試圖做的是採取郵件在日期範圍內,按日期分組並按每個日期計數。

from messages in message 
where (messages .ObservationDateTime < sqm.To) 
      && (messages .ObservationDateTime > sqm.From)) 
group orders by EntityFunctions.TruncateTime(m.ObservationDateTime) 
      into dateMessages 
select new StatsticsVm() 
    { 
     Label = dateMessages.key.Day + "/" + dateMessages.key.Month + "/" + dateMessages.key.Year, 
     MessagesCount = dateMessages.Count() 
    }; 
+0

但如果是沒有消息的0的日期,我想它也是在0計數的結果。 –

+0

我錯過了那一點:) – Frogger

0

我認爲這會爲你工作:

private IEnumerable<StatsticsVm> GetStatsticsPerDay(StatsticsQueryModel sqm) 
{ 
    var messages = GetMessagesByDateAndIU(sqm); 

    var f = new DateTime(sqm.From.Year, 1, 1); 
    var t = new DateTime(sqm.To.Year + 1, 1, 1); 

    var lookup = messages.ToLookup(x => x.ObservationDateTime.Date); 

    IEnumerable<StatsticsVm> messagesCountPerDay = 
     from n in Enumerable.Range(0, t.Subtract(f).Days) 
     let day = f.AddDays(n) 
     select new StatsticsVm() 
     { 
      Label = day.ToString(@"d/m/y"), 
      MessagesCount = lookup[day].Count() 
     }; 

    return messagesCountPerDay; 
} 
相關問題