2013-09-30 5 views
0

5 개의 열을 포함하는 DataTable이 있습니다.C# DataTable - GroupBy then OrderBy

활동 (문자열) 시계에서 (날짜 시간) 시계 아웃 (날짜 시간) 총 (더블) 유형 (INT)

나는 시계 아웃 DateTime.Date을 GROUPBY 필요하고

하고있는 OrderBy 것을 내 유형.

Activity Clock In   Clock Out   Total Type 

Drawing  09/16/13 13:30  09/16/13 13:32  0.02  1 
Drawing  09/16/13 13:40  09/16/13 13:42  0.02  1 
Testing  09/16/13 13:50  09/16/13 13:52  0.02  1 
Testing  09/16/13 13:30  09/16/13 13:34  0.04  2 
Testing  09/16/13 13:40  09/16/13 13:54  0.14  2 


Drawing  09/17/13 13:50  09/17/13 13:52  0.02  1 
Testing  09/17/13 13:30  09/17/13 13:34  0.04  2 
Testing  09/17/13 13:40  09/17/13 13:54  0.14  2 


Testing  09/18/13 13:52  09/18/13 13:54  0.02  2 

난 그냥 그룹화 도움이 필요, 이미 DataTable에있는 모든 데이터를 가지고 ...

: 나는 데이터가있는 경우

그래서 기본적으로, 나는이 같은/위해 그룹화합니다

모든 의견 ?? 나는 시도했다 : 나는 당신이하고 싶은 생각

groupedSortedTbl = dt.AsEnumerable() 
        .GroupBy(d => d.Field<DateTime>("CLOCK_OUT").Date) 
        .SelectMany(g => g.OrderBy(t => t.Field<int>("Type"))) 
        .CopyToDataTable(); 
+1

'시계 아웃'으로 그룹화 하시겠습니까? 그렇다면, 왜 당신은'SelectMany'를 사용하여 나중에 그것들을 평평하게 만드십니까? 대신에'OrderBy' +'ThenBy'를 사용할 수 있습니다. –

+0

'SelectMany'는 효과적으로 그룹핑을 제거합니다. 단일 결과 집합이나 그룹 모음을 원하십니까? –

답변

2

이 ...

groupedSortedTbl = dt.AsEnumerable() 
        .OrderBy(d => d.Field<DateTime>("CLOCK_OUT").Date) 
        .ThenBy(t => t.Field<int>("Type")) 
        .CopyToDataTable(); 
0

당신이 Clock Out에 의해 그룹 하시겠습니까? 그렇다면 왜 나중에 SelectMany을 사용하여 왜곡시키지 않습니까? 대신 OrderBy + ThenBy을 사용할 수 있습니다. 당신이 그룹을 유지하려면

DataTable groupedSortedTbl = dt.AsEnumerable() 
    .OrderBy(row => row.Field<DateTime>("CLOCK_OUT").Date) 
    .ThenBy(row => row.Field<int>("Type")) 
    .CopyToDataTable(); 

, 당신은 DataTable을 만들 끝에 CopyToDataTable을 사용할 수 없습니다. 따라서 대신 IEnumerable<Anonymous/Custom Type>을 생성 할 수 있습니다. 또는 모든 날짜 그룹에 대해 DataTables을 하나씩 선택할 수 있습니다.

IEnumerable<DataTable> dateGroups = dt.AsEnumerable() 
    .GroupBy(row => row.Field<DateTime>("CLOCK_OUT").Date) 
    .Select(g => g.OrderBy(t => t.Field<int>("Type")).CopyToDataTable());