对一个DataTable的数据进行Group By,常规的做法只能在程序里预先指定分组的列,研究了一下自定义动态分组:
using System;
using System.Text;
using System.Linq;
using System.Data;
using System.Collections.Generic;
using System.Collections;
using System.Linq.Expressions;
using System.Xml.Linq;
public static void Main()
{
DataTable dataTable1 = new DataTable();
dataTable1.Columns.AddRange(new[]
{
new DataColumn("DEPT"),
new DataColumn("SUBDEPT"),
new DataColumn("EMPNO"),
new DataColumn("NAME")
});
dataTable1.Rows.Add(new[] { "部门1", "组1", "001", "用户1"});
dataTable1.Rows.Add(new[] { "部门1", "组1", "002", "用户2"});
dataTable1.Rows.Add(new[] { "部门1", "组2", "003", "用户3"});
dataTable1.Rows.Add(new[] { "部门2", "组1", "004", "用户4"});
dataTable1.Rows.Add(new[] { "部门2", "组2", "005", "用户5"});
dataTable1.Rows.Add(new[] { "部门2", "组2", "006", "用户6"});
//固定分组列
var groupedData = from row in dataTable1.AsEnumerable()
group row by new { col1 = row.Field<string>("DEPT"), col2 = row.Field<string>("SUBDEPT") } into m
select new
{
DEPT = m.First().Field<string>("DEPT"),
SUBDEPT = m.First().Field<string>("SUBDEPT"),
COUNT = m.Count()
};
foreach (var group in groupedData)
{
Console.WriteLine(string.Format("DEPT:{0},SUBDEPT:{1},USER COUNT={2}", group.DEPT, group.SUBDEPT, group.COUNT));
}
Console.WriteLine("-----------------------------------------------------------------------");
//自定义分组列
var groupColumns = new []{"DEPT", "SUBDEPT"}.ToList();
var groupedData2 = dataTable1.AsEnumerable().GroupBy(dataRow =>
{
var stringBuilder = new StringBuilder();
groupColumns.ForEach(column => stringBuilder.Append(dataRow[column].ToString()));
return stringBuilder.ToString();
});
foreach (var group in groupedData2)
{
var row = group.First();
Console.WriteLine(string.Format("DEPT:{0},SUBDEPT:{1},USER COUNT={2}", row.Field<string>("DEPT"), row.Field<string>("SUBDEPT"), group.Count()));
}
Console.ReadKey();
/* Out put:
DEPT:部门1,SUBDEPT:组1,USER COUNT=2
DEPT:部门1,SUBDEPT:组2,USER COUNT=1
DEPT:部门2,SUBDEPT:组1,USER COUNT=1
DEPT:部门2,SUBDEPT:组2,USER COUNT=2
-----------------------------------------------------------------------
DEPT:部门1,SUBDEPT:组1,USER COUNT=2
DEPT:部门1,SUBDEPT:组2,USER COUNT=1
DEPT:部门2,SUBDEPT:组1,USER COUNT=1
DEPT:部门2,SUBDEPT:组2,USER COUNT=2
*/
}
参考:
http://www.codeproject.com/Articles/24961/Linq-Group-By-over-multiple-keys-columns-on-an-in