按年份递减,按月和按总计列出另一列Linq查询

时间:2016-01-05 21:48:07

标签: c# sql linq

这个Linq查询几乎正常工作,无法弄清楚如何做降序。以下是我到目前为止的情况:

list.GroupBy(grp => grp.year)
    .SelectMany(g => g.OrderBy(grp => grp.month))
    .ToList();

产生以下结果:

Partially Working Output

月份的顺序正确,除非年份需要按降序排列。像这样:

enter image description here

这可能要求太多,但每个分组年份也需要运行总计数天。非常感谢任何帮助!

数据如下所示:

enter image description here

对我有用的答案是:

list.OrderByDescending(grp => grp.year).ThenBy(grp => grp.month).ToList()

3 个答案:

答案 0 :(得分:1)

您需要在.ThenByDescending(grp => grp.year)表达式之后添加OrderBy,如下所示:

list.GroupBy(grp => grp.year)
    .SelectMany(g => g.OrderBy(grp => grp.month).ThenByDescending(grp => grp.year))
    .ToList();

答案 1 :(得分:1)

两条评论:

  1. 你是"分组"您的数据,然后通过SelectMany转身和取消分组,这会有效地丢弃任何分组;它只是将数据分组,但不是以任何可配置的顺序。只需一次选择所有数据,按年份递减,然后按月订购:

    list.OrderByDescending(l => l.year)
        .ThenBy(l => l.month));
    
  2. 添加"组页脚"显示小计是表示层的工作,而不是数据层。你可以创建一个混合列表,插入一个" row"在您的数据中,但通过配置呈现数据的任何控件而不是在原始数据中插入小计来添加组页脚可能更为直接。

答案 2 :(得分:0)

要实现您的目标,首先,订单年份,然后月份

见下面的代码:

list.OrderByDescending(grp => grp.year).ThenBy(grp => grp.month)
    .GroupBy(grp => grp.year)
    .SelectMany(g => g)
    .ToList();

如果您想获得每个分组年份的总天数,您可以这样做:

list.OrderByDescending(grp => grp.Year).ThenBy(grp => grp.Month)
    .GroupBy(grp => grp.Year)
    .Select(g => new { Year = g.Key, Months = g, TotalDays = g.Sum(d => DateTime.DaysInMonth(d.Year, d.Month)) })
    .ToList();

所以你将拥有一个具有3个属性的对象集合

  1. 作为日期集合的月份
  2. TotalDays,即此分组年度的总天数