2013-09-30 5 views
0

У меня есть DataTable, который содержит 5 столбцов.C# DataTable - GroupBy then OrderBy

активности (строка) Clock In (DateTime) Clock Out (DateTime) Всего (двойной) Типа (интермедиат)

Я необходимость GroupBy часов вне datetime.date и в том, что 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

Вы хотите сгруппировать по 'Clock Out'? Если да, то почему вы используете '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(); 

Если вы хотите сохранить группы, вы не можете использовать CopyToDataTable в конце, чтобы создать DataTable. Таким образом, вы можете создать вместо этого 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());