【问题标题】:LINQ Group By and aggregate fieldsLINQ 分组依据和聚合字段
【发布时间】:2013-05-14 13:28:47
【问题描述】:

我一直在为 LINQ 中的分组而苦恼,我想根据日期时间字段的日期部分进行分组并聚合其他字段。

示例表格布局

myDateField     myIntField1    myIntField2    myIntField3
01/02/2013      5              5              5
01/02/2013      5              5              5
02/02/2013      10             10             10
02/02/2013      10             10             10

我想返回一个列表

myDateField     myIntField1    myIntField2    myIntField3
01/02/2013      10             10             10
02/02/2013      20             20             20

我已经使用 msdn 示例管理了以下内容,但无法真正了解如何使用它。它指出我应该能够访问新的 BookedList 组,但不断收到匿名类型错误等。

        Dim bestdays = From a In b
                        Where a.BookedOn < a.EventDayTime And a.Cancelled = False
                        Group By BookDate = a.BookedOn.Value.Date
                        Into BookedList = Group

【问题讨论】:

  • .Take(n) 为您执行此操作(其中 n 是 从序列开头开始的连续元素数)。还是您对遇到的错误有疑问?
  • 抱歉@DaveRook 标题可能具有误导性,我知道如何获取 5 条记录,但我上面的代码似乎没有分组。它也不聚合 myIntFields。我知道如何在 SQL 中执行此操作 - 对所有 myInt 字段求和,然后按日期字段分组,我如何使用 LINQ-SQL 完成此操作?

标签: .net vb.net linq linq-to-sql group-by


【解决方案1】:

语法是Into [FIELD_NAME1] = [AGGREGATE_FUNCTION1]([VALUE1]), [FIELD_NAME2] = [AGGREGATE_FUNCTION2]([VALUE2]) ...。键将自动成为返回对象的一部分。

所以你正在寻找这样的东西:

Class TableRow
  Public Property myDateField As Date
  Public Property myIntField1 As Integer
  Public Property myIntField2 As Integer
  Public Property myIntField3 As Integer
  Sub New(mydate As Date,
          myint1 As Integer, myint2 As Integer, myint3 As Integer)
    myDateField = mydate
    myIntField1 = myint1
    myIntField2 = myint2
    myIntField3 = myint3
  End Sub
End Class

Sub Main()
  Dim tablesRows As New List(Of TableRow)
  tablesRows.Add(New TableRow(Today, 5, 10, 15))
  tablesRows.Add(New TableRow(Today, 6, 11, 16))

  Dim v = From r In tablesRows Group By r.myDateField
          Into Total1 = Sum(r.myIntField1),
               Total2 = Sum(r.myIntField2),
               Total3 = Sum(r.myIntField3)
End Sub

【讨论】:

  • 完美!不仅是一个答案,而且我认为您也帮助我了解了它的工作原理。非常感谢!
【解决方案2】:

也许这可以做你的工作

Dim bestdays = (From a In b
               Where a.BookedOn < a.EventDayTime And a.Cancelled = False
               Group By BookDate = a.BookedOn.Value.Date
               Into BookedList = Group).Take(5)

【讨论】:

  • 谢谢 Manolis,请参阅上面的评论,更改标题可能会产生误导,我知道如何获取 5 条记录,但我的 group by 不起作用。
  • 试试这个:按 a.BookedOn 分组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2020-01-17
  • 2023-02-13
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多