如何使用特定 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;

如何使用特定 ID 将数据表拆分为多个数据表,而无需在 c# 中使用 linq

您可以创建 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 字典和新的结果表来跟踪事物。 如果您需要更多详细信息,我可以尝试编写一个更完整的示例,但概念是相同的。