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個別に表示できるように、各グループを独自のデータバインディングにデータバインドしたい場合があります。各グループを日付で並べ替えたり、各グループの最初の要素のみが必要な場合があります。グループ化がどのように構成されているかを理解すれば、探しているものを正確に達成するのは非常に簡単です。

編集:

グループ化の一部のフィールドを集約することだけを考えている場合、これは、結果をループすることに頼る必要なしに、非常に簡単に実行できます。に呼び出しを追加するだけで、結果を目的の集計フォームに投影できますSelectGroupBy

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 に答える