LINQ - 按年份和月份分组

3

我正试图编写一个linq查询,按年/月从数据表中分组数据。

我已经成功地按其中一个进行了分组,但不能同时按两个进行分组...

       Dim q = From p As DataRow In DTCalls.Rows _
                Group By Year = p("DATE").Year _
                Into CALLS = Count(p("CALL_ID")) _
                Select Year, CALLS

如何在同一个查询中按年份和月份分组/排序?

源数据:

DATE                    CALL_ID
2012-05-01 23:52:44   6587
2012-02-03 09:17:41   6562
2012-05-01 06:32:41   6565
2012-02-03 12:47:41   6565
2011-05-31 08:37:41   6511

预期输出:

DATE       COUNT
2011-05      1
2012-02      2
2012-05      2

1
在你的例子中,你可以简单地按日期分组。你应该展示一个在同一年/月份内有两个日期的例子。 - Meta-Knight
抱歉,示例数据有误。(已更新) - madlan
2个回答

3
你需要按两个属性(年份+月份)的匿名类型进行分组。在VB.NET中,你还需要应用Key关键字。 匿名类型 (Visual Basic)
Dim dateGroups =
    From row In table
    Let year = row.Field(Of Date)("DATE").Year
    Let month = row.Field(Of Date)("DATE").Month
    Group row By YearMonth = New With {
        Key .year = year,
        Key .month = month
    } Into DateGroup = Group
    Order By YearMonth.year, YearMonth.month

For Each grp In dateGroups
    Console.WriteLine("Date: {0}-{1} Count:{2}",
                      grp.YearMonth.year,
                      grp.YearMonth.month,
                      grp.DateGroup.Count())
Next

你的第一段是错误的。有两个条目是2012年3月,一个是2011年3月。 - Meta-Knight
与此同时,OP已编辑问题以提供更好的示例数据。然而,答案应该仍然有效。(编辑以提供正确的顺序) - Tim Schmelter
太好了 :) 我正在测试你的第一个编辑,使用 dateGroups.ToList() 来绑定到 datagridview。 - madlan

0
你需要创建一个包含两个值的匿名类型,或者你可以使用元组:
Group By Tuple.Create(p("DATE").Year, p("DATE").Month)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接