【问题标题】:Dividing one DataTable into many将一个 DataTable 分成多个
【发布时间】:2015-12-08 05:24:41
【问题描述】:

我正在尝试将行从一个DataTable 转移到许多其他动态生成的DataTables。父 DataTable 包含以下格式的数据:

ID  Name  Type
--------------
 1   ABC     0
 1   PQR     2
 2   XYZ     8
 2   QWE     7
 3   IOP     6

我希望具有相同ID 的行必须在一个表中。例如,上述场景将生成 3 个表。一个包含带有ID = 1 的行,第二个包含带有ID = 2 的行,第三个包含带有ID = 3 的行。我正在尝试使用以下代码来实现这一点:

DataSet ResultantDataSet = new DataSet();
DataView dv = InputDataSet.Tables[0].DefaultView;
dv.Sort = "ID";
int newID = -1;
DataTable dt = null;
foreach(DataRow dr in dv.ToTable().Rows) {
    if (newID != int.Parse(dr["ID"].ToString())) {
        newID = int.Parse(dr["ID"].ToString());
        if (dt != null) ResultantDataSet.Tables.Add(dt);
        dt = new DataTable();
    } else {
        dt.ImportRow(dr);
    }
}

但问题在于ResultantDataSet 包含具有空行且具有单个未命名列的表。出了什么问题?

【问题讨论】:

  • 不要吹毛求疵之类的,但你为什么要这样做?这听起来像是一种可怕的非规范化形式。
  • @Zane 实际上我有一个接受DataSets 并以特定格式显示它们的用户控件。要将其转换为该格式,我需要这样做。
  • 好吧,那么你最好的选择听起来像是将唯一 ID 插入到 #Table 中,然后循环遍历每个值,并使用动态 SQL 语句将每个值插入到表中。抱歉,我不确定我是否有时间为您写一个代码示例来说明如何完成此操作。
  • 您是否尝试在 dt = new DataTable() 调用之后立即将列 ID、名称和类型显式添加到新的 dt 对象?也许 ImportRow 不会自动创建列,如果没有现有列,它就无法将原始行中的值复制到新表的新行中。

标签: c# .net sql-server datatable dataset


【解决方案1】:

试试这个。

        IEnumerable<DataTable> tables =
            table.AsEnumerable().GroupBy(t => t.Field<int>("ID")).Select(t => t.CopyToDataTable());

【讨论】:

  • 如果可行(我没有尝试过),这将是一个非常优雅的解决方案。
  • 感谢@Yohannes,您是救生员。 :)
  • @Zane 对我来说反之亦然:D 但我没想到会有一个解决方案。这就像一个魔术。 :)
猜你喜欢
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2013-06-11
  • 2015-10-24
  • 2020-07-10
  • 1970-01-01
  • 2016-04-27
  • 2017-10-19
相关资源
最近更新 更多