如何使用特定 ID 将数据表拆分为多个数据表,而无需在 c# 中使用 linq
本文关键字:数据表 linq 何使用 ID 拆分 | 更新日期: 2023-09-27 17:57:10
我想将单个数据表拆分为多个DataTable
。
表 1 包含客户端 ID、客户端名称
(1,客户端 1)(1,客户端 2)(1,客户端 3)(2,客户端4)(2,客户端 5)
我想把这张表分成
表 2 = (1,客户端 1)(1,客户端2)(1,客户端 3)
和
表 3 将具有 (2,客户端 4)(2,客户端 5)。
DataRow
相同的客户端 ID 将移动到单独的DataTable
。我该怎么做?
我试过了,但它不起作用。 我想在 c# 中没有 linq 的情况下做到这一点。 如何在不使用 c# 中的 linq 的情况下使用特定 id 将数据表拆分为多个数据表?
foreach (DataRow row in dsBindSubCategory.Tables[0].Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
if (Convert.ToInt32(dsBindSubCategory.Tables[0].Rows[i]["ClientId"]) != Convert.ToInt32(dsBindSubCategory.Tables[0].Rows[i - 1]["ClientId"]))
{
newDs.Tables.Add(newDt);
j++;
newDt = dsBindSubCategory.Tables[0].Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
i = 0;
}
}
return newDs;
您可以创建 DataViews 并将它们复制到 dataTables:
DataView DataView1 = new DataView(table,"ClientId=1","ClientId ASC", DataViewRowState.CurrentRows);
DataTable dt1 = DataView1.Table.Clone();
下面的代码将从一个数据表创建两个数据表。 请注意,我也在代码中创建原始表,因为我无权访问您的数据源。
DataTable table = new DataTable();
DataColumn col1 = new DataColumn("clientid");
DataColumn col2 = new DataColumn("clientname");
col1.DataType = System.Type.GetType("System.Int32");
col2.DataType = System.Type.GetType("System.String");
table.Columns.Add(col1);
table.Columns.Add(col2);
DataRow r = table.NewRow();
r[col1] = 1;
r[col2] = "client 1";
table.Rows.Add(r);
r = table.NewRow();
r[col1] = 1;
r[col2] = "client 2";
table.Rows.Add(r);
r = table.NewRow();
r[col1] = 2;
r[col2] = "client 3";
table.Rows.Add(r);
// Create two new data tables
DataTable dt1 = new DataTable("t1");
DataTable dt2 = new DataTable("t2");
// Make the columns of the new tables match the existing table columns
foreach(DataColumn dc in table.Columns)
{
dt1.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
dt2.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
}
foreach (DataRow row in table.Rows)
{
int id = Convert.ToInt32(row["clientid"]);
if (id == 1)
{
DataRow dr = dt1.NewRow();
dr.SetField("clientid", row["clientid"]);
dr.SetField("clientname", row["clientname"]);
dt1.Rows.Add(dr);
}
else
{
DataRow dr = dt2.NewRow();
dr.SetField("clientid", row["clientid"]);
dr.SetField("clientname", row["clientname"]);
dt2.Rows.Add(dr);
}
}
}
所以,显然这只是创建两个表。 由于您的注释说您希望每个唯一 id 有多个新数据表,因此您需要使用以下代码:
DataTable newTable= new DataTable();
// Make the columns of the new tables match the existing table columns
foreach(DataColumn dc in table.Columns)
{
newTable.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
newTable.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType));
}
每次循环访问源表中的行并找到新的 clientID 时。 您可能需要某种 id 字典和新的结果表来跟踪事物。 如果您需要更多详细信息,我可以尝试编写一个更完整的示例,但概念是相同的。