将未知数量的列添加到Datatable并填充数据的最佳方法?

时间:2016-07-07 03:05:47

标签: c# linq datatable

我已经研究过datatable.merge()和LINQ,但不确定Merge是否适用于这种情况,而我现在才开始了解LINQ。

在我的项目中,我必须将未知数量的列加入现有数据集。

我目前正在查询数据库并获取必须创建的每个列的记录,然后是与新列和现有数据集匹配的项目表和ID。

所以结构是这样的:

foreach(Datarow row in newColumns.rows)
{
    originialDataTable.Columns.Add("\"Supplier: " + row["Supplier"] + "\r\n" +
                                        "ETA: " + row["ETADate"] + "\r\n" +
                                        "Shipped: " + row["ShipDate"] + "\r\n" +
                                        "Cartons: " + row["ContainerQty"] + "\r\n" +
                                        "Delivery Mode: " + row["ShipType"] + "\r\n" +
                                        "Container number: " + row["ContainerNumber"] + "\"");
                for (int c = 0; c < cmDataTable.Rows.Count; c++)
                {
                    for (int b = 0; b < originialDataTable.Rows.Count; b++)
                    {
                        string containerItem = cmDataTable.Rows[c]["POnumber"].ToString() + cmDataTable.Rows[c]["ItemNumber"].ToString();
                        string poItem = originialDataTable.Rows[b]["ponumber"].ToString() + originialDataTable.Rows[b]["stocknumber"];
                        if (containerItem == poItem && cmID == cmDataTable.Rows[c]["CMID"].ToString())
                        {
                            originialDataTable.Rows[b][position] = cmDataTable.Rows[c][2];
                        }
                    }
                } 
}

我知道我应该将for循环更改为foreach,但我不确定上述代码的质量。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

关于要求并不完全清楚,但尝试了一些事情,请查看以下代码:

    DataTable dt = new DataTable(); // Create DataTable

    dt.Columns.Add("A", typeof(int)); // Add a Column
    dt.Columns["A"].DefaultValue = 5; // Set Column default value

    dt.Rows.Add(3); // Add a DataRow

    DataTable dt1 = new DataTable(); // Create DataTable

    dt1.Columns.Add("C", typeof(int)); // Add a Column
    dt1.Columns["C"].DefaultValue = 5; // Set Column default value

    dt1.Rows.Add(3); // Add a DataRow

    dt.Merge(dt1); // Merge dt1 into dt

您可以在此类代码中找到的挑战即使您希望合并的DataTable包含two columns and one row,它实际上也会包含2 rows,其中每个DataTable的合并列都将填充默认值(尝试运行代码以理解),如果我不提供DefaultValue,那么它填写Null,以下是上述代码的结果:

                  A   C
                  3   5
                  5   3

现在我的理解是这个结果不可取,​​然后我尝试使用一些Linq Join,Full Outer Join来弄清楚我们是否可以有一个解决方案,但似乎也不太可能因为在一个Join它遍历所有行和与上面的Merge类似,为所有不存在的行添加默认值。

我能想到的唯一解决方案是:

  • 明确地将所有列添加到新的DataTable
  • 为要插入的行数运行for循环,可以来自任何DataTable(源)并复制循环内的值
  • 默认值为不可用值,对于其他Datatable,除非我们具有完全相同的行数