2012-02-11 96 views
2

以下LINQ查询获取前12个月的数据并按月对其进行聚合。在LINQ查询中按时间顺序对分组查询进行排序

我想按时间顺序排序,当前月份是查询中最近的月份。

达到此目的的最佳方法是什么?

public IEnumerable<EventMonthlySummaryMonthly> GetLastYearEventGrid() 
     { 

      DateTime currentDate = DateTime.Now.AddYears(-1).AddMilliseconds(1); 

      var summary = from p in db.Events 
          where (p.StartDate > currentDate) && (p.StartDate != null) 
          let k = new 
          { 
           Month = p.StartDate.Month 
          } 
          group p by k into t 
          select new EventMonthlySummaryMonthly 
          { 
           Month = t.Key.Month, 
           EventsWhatsOn = t.Count(p => p.EventTypeId == 1), 
           EventsRegular = t.Count(p => p.EventTypeId == 2), 
           EventsExhibitions = t.Count(p => p.EventTypeId == 3), 
           EventsAll = t.Count(p => p.EventTypeId != null), 
          }; 

      return summary; 
     } 
+0

您可以使用排序描述符来排序汇总ListM,但您希望它在LINQ中进行排序。 – 2012-02-11 13:39:23

回答

1

通过对从分组的月降最大日期排序。如果范围跨越几年,这会给你包含最新日期的月份。

orderby t.Max(p => p.StartDate) descending 
select new EventMonthlySummaryMonthly 
{ 
    Month = t.Key.Month, 
    EventsWhatsOn = t.Count(p => p.EventTypeId == 1), 
    EventsRegular = t.Count(p => p.EventTypeId == 2), 
    EventsExhibitions = t.Count(p => p.EventTypeId == 3), 
    EventsAll = t.Count(p => p.EventTypeId != null), 
} 
+0

感谢您的提示,但这仍然不考虑年份和月份订单上升。 – Nick 2012-02-11 14:05:18

+0

这应该给你最近的日期第一个月。这不是你想要的吗? – Magnus 2012-02-11 14:09:33

+0

投影到EventMonthlySummaryMonthly似乎改变了顺序。 – Nick 2012-02-11 14:25:04

0
public IEnumerable<EventMonthlySummaryMonthly> GetLastYearEventGrid() 
    { 

     DateTime currentDate = DateTime.Now.AddYears(-1).AddMilliseconds(1); 

     var summary = (from p in db.Events 
         where (p.StartDate > currentDate) && (p.StartDate != null) 
         let k = new 
         { 
          Month = p.StartDate.Month 
         } 
         group p by k into t 
         select new EventMonthlySummaryMonthly 
         { 
          Month = t.Key.Month, 
          EventsWhatsOn = t.Count(p => p.EventTypeId == 1), 
          EventsRegular = t.Count(p => p.EventTypeId == 2), 
          EventsExhibitions = t.Count(p => p.EventTypeId == 3), 
          EventsAll = t.Count(p => p.EventTypeId != null), 
         }).OrderByDescending(item=>item.Month); 

     return summary; 
    } 
+0

该范围可能跨越多年,因此这不会产生期望的结果。谢谢你的回应。 – Nick 2012-02-11 14:01:44