C# 在另一列Linq查询中按年份分组、按月份排序和总计

C# 在另一列Linq查询中按年份分组、按月份排序和总计,c#,sql,linq,C#,Sql,Linq,如果这个Linq查询几乎正常工作,就无法理解如何执行降序。以下是我到目前为止的情况: list.GroupBy(grp => grp.year) .SelectMany(g => g.OrderBy(grp => grp.month)) .ToList(); 这将产生以下结果: 月份的顺序正确,但年份需要按降序排列。像这样: 这可能要求太多,但也需要每年总共运行几天。非常感谢您的帮助 数据如下所示: list.GroupBy(grp => grp.y

如果这个Linq查询几乎正常工作,就无法理解如何执行降序。以下是我到目前为止的情况:

list.GroupBy(grp => grp.year)
    .SelectMany(g => g.OrderBy(grp => grp.month))
    .ToList();
这将产生以下结果:

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

这可能要求太多,但也需要每年总共运行几天。非常感谢您的帮助

数据如下所示:

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

我的答案是:

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

您需要在您的
OrderBy
表达式之后添加
。然后按降序(grp=>grp.year)
,如下所示:

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

要实现您想要的目标,首先,按年度订购,然后按月份订购

见下面的代码:

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个属性的对象集合

  • 是日期集合的月份
  • TotalDays,是此分组年份的总天数
  • 两点意见:

  • 您正在对数据进行“分组”,然后通过一个
    SelectMany
    (选择多个)(选择多个)(选择多个)>来改变和取消分组,这实际上会丢弃任何分组;它只是将数据分组,而不是按任何可配置的顺序。只需一次选择所有数据,按年份递减排序,然后按月份排序:

    list.OrderByDescending(l => l.year)
        .ThenBy(l => l.month));
    
  • 添加“组页脚”以显示小计是表示层的工作,而不是数据层的工作。您可以创建一个混合列表,在数据中插入一个总的“行”,但通过配置显示数据的任何控件而不是在原始数据中插入小计,添加组页脚可能更简单


  • 。然后按降序(grp=>grp.year)
    添加到初始的order by之后。是否有
    OrderByDescending
    ?您可以使用自动完成功能查看可用的LINQ方法。他希望先按月排序,然后按年排序。您能否提供有关初始
    列表中数据的信息?列表中的项目类型是什么?然后似乎忽略了ByDeceding(grp=>grp.Year)这是一个小的格式更改;现在的代码应该可以。我知道上次你有双点,但我看到了。然而,BYDESCOING部分仍被忽略。从1980年、1981年、1982年等开始的年份,应该是1982年、1981年、1980年等。还有一个括号放错了位置,因此排序应用于
    SelectMany
    的结果,而不是
    OrderBy
    的结果。排序现在是正确的,仍然适用于总数。1。谢谢你,它的作品完美,简单的代码。2.是的,我将在前端进行计数。