0

我正在使用它来获取按日期排序的所有记录:

Dim myData = db.Tbl_Exercises.Where(Function(x) x.Exercise_Employee_ID).OrderBy(Function(x) x.Exercise_Create_Date)

我用这个循环:

    For Each i As Tbl_Exercise In myData

        data.Add(New Object() {i.Tbl_Exercise_Type.ExType_Desc, i.Exercise_Duration})

    Next

我怎样才能分组i.Tbl_Exercise_Type.ExType_Desc所以我没有重复?

我试过这个:

Dim myData = db.Tbl_Exercises.Where(Function(x) x.Exercise_Employee_ID).GroupBy(Function(x) x.Exercise_Type_ID)

但是,我不知道如何访问循环中的变量。

谢谢你。

编辑:

<EmployeeAuthorize()>
Function ExercisePieChartData() As JsonResult

    ' get current employee's id
    Dim db1 As EmployeeDbContext = New EmployeeDbContext
    Dim user1 = db1.Tbl_Employees.Where(Function(e) e.Employee_EmailAddress = User.Identity.Name).Single()
    Dim empId = user1.Employee_ID

    Dim activityGroups = db.Tbl_Exercises.Where(Function(x) x.Exercise_Employee_ID = empId).GroupBy(Function(x) x.Exercise_Type_ID)

    Dim data = New List(Of Object)

    ' columns (headers)
    data.Add(New Object() {"Type", "Duration"})

    ' Iterate through each collection of activities, grouped by activity types
    For Each group In activityGroups

        ' Iterate through each Tbl_Exercise in the group
        For Each activity In group

            ' Do something with an individual element
            data.Add(New Object() {activity.Tbl_Exercise_Type.ExType_Desc, activity.Exercise_Duration})

        Next

    Next

    Return Json(data, JsonRequestBehavior.AllowGet)

End Function

编辑:

    ' Iterate through each collection of activities, grouped by activity types
    For Each group In activityGroups

        Dim type = ""
        Dim duration = 0

        ' Iterate through each Tbl_Exercise in the group
        For Each activity In group

            ' Do something with an individual element
            type = activity.Tbl_Exercise_Type.ExType_Desc
            duration += activity.Exercise_Duration

        Next

        data.Add(New Object() {type, duration})

    Next
4

1 回答 1

1

注意:您的示例并不完全清楚,因此我将对您尝试使用我的解决方案做什么做一些假设。随着更多详细信息的提供,我将根据需要对其进行修改。

从外观上看,对于每个员工,您都在尝试获取他们执行的锻炼类型的集合,并且对于每种类型的锻炼,您还希望获得他们执行这些活动所花费的时间长度的集合。

我将假设一行Tbl_Exercises看起来像这样:

Public Class Tbl_Exercise

    Public Property Exercise_Employee_ID As Integer
    Public Property Exercise_Type_ID As Integer
    Public Property Exercise_Type_Desc As String
    Public Property Exercise_Duration As Integer

End Class

您最后所做的尝试非常接近,您只需要在创建分组后实际使用它。

GroupBy方法在这里返回给您的内容实际上是IGrouping(Of Integer, Tbl_Exercise)键是Exercise_Type_ID,值是按键分组的行的集合。要访问它们非常简单,您只需将分组视为一种嵌套集合:

    Dim activityGroups = db.Tbl_Exercises.Where(Function(x) x.Exercise_Employee_ID = employeeId).GroupBy(Function(x) x.Exercise_Type_ID)

    ' Iterate through each collection of activities, grouped by activity types
    For Each group In activityGroups

        ' Iterate through each Tbl_Exercise in the group
        For Each activity In group

            ' Do something with an individual element
            Console.WriteLine(activity.Exercise_Duration)

        Next

    Next

显然,您可能想做一些不同于打印单个集合的事情,您可能希望将每个分组数据绑定到它们自己的分组,DataGrid以便您可以单独显示它们。您可能希望按日期对每个分组进行排序,或者您可能只需要每个组中的第一个元素。一旦您了解了分组的结构,就应该很容易准确地完成您正在寻找的内容。

编辑:

如果您只是想聚合分组中的某些字段,这很容易完成,无需求助于循环结果。只需在您的遗嘱上添加一个调用Select,您GroupBy就可以将结果投影到您想要的聚合形式中:

Dim data = db.Tbl_Exercises _
                .Where(Function(x) x.Exercise_Employee_ID = empId) _
                .GroupBy(Function(x) x.Exercise_Type_Desc) _
                .Select(Function(x)
                            Return New With {
                                ' x.Key will give you access to the value that the grouping is grouped by
                                .Exercise_Type_Desc = x.Key,
                                .TotalDuration = x.Sum(Function(y) y.Exercise_Duration)
                            }
                        End Function)
于 2012-09-21T20:13:29.990 回答