根据列值将一个DataTable拆分为2个或更多个DataTable

13

我有一个名为"DTHead"的DataTable,其中包含以下记录:

 MIVID      Quantity         Value
------     ----------       --------
   1           10             3000
   1           20             3500
   1           15             2000
   2           20             3000
   2           50             7500
   3           25             2000

以下是从stackoverflow获取的内容:

我需要将上面的DataTable根据MIVID拆分成三个表,如下所示;

DTChild1:

  MIVID           Quantity        Value
 -------         ----------     ---------
   1                10             3000
   1                20             3500
   1                15             2000

DTChild2:

  MIVID           Quantity        Value
 -------         ----------     ---------
   2                20             3000
   2                50             7500

DTChild3:

  MIVID           Quantity        Value
 -------         ----------     ---------
    3               25             2000

假设Header DataTable 包含 4 种不同的 MIVID,那么应该基于这 4 种 MIVID 创建 4 个 Child DataTable。如何实现?

2个回答

34

使用LINQ to DataTable将第一列按GroupBy进行分组,并使用方法CopyToDataTable将行列表复制到DataTable

 List<DataTable> result = DTHead.AsEnumerable()
            .GroupBy(row => row.Field<int>("MIVID"))
            .Select(g => g.CopyToDataTable())
            .ToList();

然后,您可以按照您期望的方式将结果作为DataTable列表获取。


2
@RohithShenoyG:你可以使用匿名类型,类似这样:GroupBy(row => new { Field1 = row.Field<int>('Field1'), Field2 = row.Field<int>('Field2')}) - cuongle
@Cuong Le,这个不错,省了我很多时间。只需要用“”代替'即可(我不是在卖弄聪明,你显然知道这一点,但可能是直接写在这里的“多字段注释”)。 - śmiglidigli
@śmiglidigli:我不确定我理解你的意思,请你能详细解释一下吗? - cuongle
我只是想说你在关于多个字段的注释中使用了 'Fieldx' 符号,这将无法编译,而应该使用 "Fieldx" 符号。 - śmiglidigli
请注意,如果查询没有返回任何行,则CopyToDataTable()会抛出“源不包含任何DataRow”的异常。 - Kevin Swann
显示剩余3条评论

0
DataTable tbl = new DataTable("Data").AsEnumerable()
    .Where(r => r.Field<int>("ParentId") == 1) // ParentId == 1
    .Where(r => r.Field<int>("Id") > 3) // Id > 3
    .Where(r => r.Field<string>("Name").Contains("L")) // Name contains L
    .OrderBy(r => r.Field<int>("Id")) // Order by Id
    .CopyToDataTable();

你能否请看一下我关于这个问题的一个问题 - Moeez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接