PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net |

DataTble의 정보 LINQ로 Grouping하기

앞에서 LINQ 로 그룹핑을 하는 것을 했었다
이때는 List(Of T)나 배열을 갖고 했었자
이제 DataTable의 데이타로 그룹핑을 해보자
가장 간단하게 어떤 휠드의 유일한 값만 모으는 것도 그룹핑의 시작이다


 '' 아래의 Q!Data_1 을 Q("Data_1")으로 접근해도 된다
 Dim oGroup = From Q In oTable.AsEnumerable
                 Group Q By Alpha = Q!Data_1 Into Group
                 Order By Alpha
                 Select Alpha
''그룹핑된 결과물로 새로운 DataTable만들기
        Dim oSubTbl As New DataTable
''하나의 열만 필요하니 열을 하나만 추가하고
        oSubTbl.Columns.Add("Alpha")
''LINQ결과 집합체를 순환하면서..DataTable의 행을 추가
        For iX As Integer = 0 To oGroup.Count - 1
            Dim oRow As DataRow = oSubTbl.NewRow
            oRow.Item(0) = oGroup(iX)
            oSubTbl.Rows.Add(oRow)

        Next
''새로 만든 테이블을 DataGridView2개체의 DataSource로		
        Me.DataGridView2.DataSource = oSubTbl



엑셀에서 하였던 부분합을 다양한 계산함수로 해보자
합계,평균,최대값,죄소값,등등..

LINQ의 결과값을 받는 변수의 타입을 명시적으로 하지 않아도 된다
그림과 같이 변수에 마우스를 가져다가 올리면 LINQ의 내용에 따라서 어떤 Systme.Collections.Generic.IEnumerable(Of 타입)을
볼수 있고, 다음 작업을 하는데 도움이 된다



anonymous타입은 알 수 없는 익명의 타입..다음 페이지에서 좀더 추가 설명하자
VB.Net Studio는 궁금한 변수나 상수,개체명등에
마우스를 가져다 대면 팁들이 나타나니까..항상 잘활용하시면 된다

    Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
        '' 앞에서 하였던 Delegate,LAMBDA표현식의 활용을 하게 된다
        '' 아하..이런 것을 하려고 앞전에서 복잡한 소리를 했구나..
        '' 다시 앞으로 가서 보아야겠는데..하시고 다시 가서 보셔야 할 것이다
        '' 귀찮지만 한번 개념을 알고 활용하게 되면 편리한 도구 야무지게 챙기게 된다
        '' 데이타타입을 Object로 하였다
        '' 휠드마다 데이타타입이 다를수 있으니 일일이 따지는 것 보다는
        '' VBA에서 Variant타입과 같은 역할을 하는 Obejct타입을 전달하면 편리하다
        Dim oGroup = From Q In oTable.AsEnumerable
                Group Q By Alpha = Q!Data_1 Into myGroup = Group
                Order By Alpha
                Select Alpha, mySum = myGroup.Sum(Function(p) p.Field(Of Object)("Data_5")),
                myCount = myGroup.Count(Function(p) p.Field(Of Object)("Data_5")),
                myAvg = myGroup.Average(Function(p) p.Field(Of Object)("Data_5")),
                myMax = myGroup.Max(Function(p) p.Field(Of Object)("Data_5")),
                myMin = myGroup.Min(Function(p) p.Field(Of Object)("Data_5"))

        '' LINQ의 결과물을 표현하기 위한 새로운 DataTable개체 만들기
        Dim oSubTbl As New DataTable
        oSubTbl.Columns.Add("Alpha")
        oSubTbl.Columns.Add("Sum")
        oSubTbl.Columns.Add("Count")
        oSubTbl.Columns.Add("Average")
        oSubTbl.Columns.Add("Max")
        oSubTbl.Columns.Add("Min")
        '' LINQ에서 부여한 myCount,myAvg,mMax등의 변수, 즉 속성명을
        '' 사용하여 읽어 오면 된다
        For iX As Integer = 0 To oGroup.Count - 1
            Dim oRow As DataRow = oSubTbl.NewRow
            oRow.Item(0) = oGroup(iX).Alpha
            oRow.Item(1) = oGroup(iX).mySum
            oRow.Item(2) = oGroup(iX).myCount
            oRow.Item(3) = oGroup(iX).myAvg
            oRow.Item(4) = oGroup(iX).myMax
            oRow.Item(5) = oGroup(iX).myMin
            oSubTbl.Rows.Add(oRow)

        Next
        Me.DataGridView2.DataSource = oSubTbl
    End Sub
    



아래화일에 설명을 주석으로 달았으니
실행하시면서 잘 관찰하시고, 의문이 되는 것은 항상 메일하시면 된다

***[LOG-IN]***