-1

我正在使用 c#,我的 Windows 表单中有一个 DataTable,如下所示。

Ref1  |  ItemNo  | ItemDesc
1     |  54637   | Cleaner
2     |  54638   | Cloth
1     |  54638   | Cloth
1     |  54639   | Spray Bottle
2     |  54637   | Cleaner

我需要在单独的列中获取每个 Ref1 的所有产品。所以我需要得到以下内容。

Ref1  |  ItemNo1 | ItemNo2 | ItemNo3 | ItemNo4
1     |  54637   | 54638   | 54639   | NULL
2     |  54638   | 54637   | NULL    | NULL

对于某些 Refs,我最多可能有 50 件物品,但对于其他人来说只有 1 或 2 件。

完成这项工作的最有效方法是什么?

4

1 回答 1

0

我想没有真正好的方法,但这就是它应该如何工作

DataTable table = new DataTable();
table.Columns.Add("Ref1", typeof(int));
table.Columns.Add("ItemNo", typeof(int));
table.Columns.Add("ItemDesc", typeof(string));

table.Rows.Add(1, 12345, "Test");
table.Rows.Add(1, 12346, "Test2");
table.Rows.Add(1, 12347, "Test3");
table.Rows.Add(2, 12345, "Test");

DataTable tableNew = new DataTable();

tableNew.Columns.Add("Ref1", typeof(int));

var result = table.AsEnumerable().GroupBy(x => x.Field<int>("Ref1"));
var max = result.Max(x => x.Count());

for (int i = 1; i <= max; i++)
{
    tableNew.Columns.Add($"ItemNo{i}", typeof(int));
}

foreach (var group in result)
{
    var newRow = tableNew.NewRow();
    newRow.SetField<int>("Ref1", group.Key);

    var itemNo = 1;
    foreach(var row in group)
    {
        var val = row.Field<int>("ItemNo");
        newRow.SetField<int>($"ItemNo{itemNo}", val);
        itemNo++;
    }
    tableNew.Rows.Add(newRow);
}

如果数据来自数据库,我建议将部分逻辑移动到 SQL 查询

于 2020-01-24T08:39:00.757 回答