【问题标题】:Unable to group by DataTable无法按数据表分组
【发布时间】:2020-06-10 15:40:55
【问题描述】:

我正在尝试按以下数据表进行分组:

+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| ID_OR | TIPO_OR | ORA_OR              | SENT_OR | ID_OR_CFG | ID_ART | TIPO_ART | COD_ART      | QTA_ART | ID_OR_ART | COD_VAR | ID_ART_VAR |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 132    | PLUREP   | CAFFE        | 1       | 40        |         |            |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 133    | PLUREP   | REPARTO 0019 | 1       | 40        |         |            |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 134    | PLUREP   | REPARTO 0018 | 1       | 40        |         |            |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 135    | PLUREP   | REPARTO 0037 | 1       | 40        |         |            |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 136    | PLUREP   | CAFFE        | 1       | 40        | VAR0001 | 136        |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 136    | PLUREP   | CAFFE        | 1       | 40        | VAR0002 | 136        |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+
| 40    | MENU    | 10/06/2020 15:56:47 | 0       | 1         | 136    | PLUREP   | CAFFE        | 1       | 40        | VAR0003 | 136        |
+-------+---------+---------------------+---------+-----------+--------+----------+--------------+---------+-----------+---------+------------+

datatable 中的数据来自 MySQL,该表表示订单信息、项目和项目的变体,所以我正在尝试构建一个订单列表,其中包含它的项目,其中包含它的变体。

首先,我需要将数据表按等于订单 ID 的ID_OR 分组,所以我尝试执行以下var ordini = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID_OR")); 但它没有效果,通过 ordini 的迭代无论如何都会遍历所有数据表行...然后在 ordini 迭代中,我试图通过仍然按ID_ART 对它们进行分组来迭代抛出每个订单的项目,但即使是那个 group by 也没有效果,只是用ID_ART 136 将项目添加了三倍在列表中。

我构建订单列表的整个代码如下所示:

var ordini = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID_OR"));
foreach(var ordine in ordini)
{
    int id_ordine = ordine.Key;
    foreach (DataRow ro in ordine)
    {
        List<Ordine.Articoli> list_articoli = new List<Ordine.Articoli>();
        var articoli = dt.AsEnumerable().Where(r => r.Field<int>("ID_OR_ART") == id_ordine).GroupBy(r => r.Field<int>("ID_ART"));
        foreach(var articolo in articoli)
        {
            int id_articolo = articolo.Key;
            foreach (DataRow ra in articolo)
            {               
                List<Ordine.Varianti> list_varianti = new List<Ordine.Varianti>();
                var varianti = articolo.Where(r => r.Field<int?>("ID_ART_VAR") == id_articolo);
                foreach (DataRow rv in varianti)
                {
                    list_varianti.Add(new Ordine.Varianti(rv.Field<string>("COD_VAR"), id_articolo));
                }
                list_articoli.Add(new Ordine.Articoli(id_articolo, ra.Field<string>("TIPO_ART"), ra.Field<string>("COD_ART"), ra.Field<float>("QTA_ART"), ra.Field<int>("ID_OR_ART"), list_varianti));
            }
        }
        list_ordini.Add(new Ordine(id_ordine, ro.Field<string>("TIPO_OR"), ro.Field<DateTime>("ORA_OR"), Convert.ToBoolean(ro.Field<ulong>("SENT_OR")), ro.Field<int>("ID_OR_CFG"), list_articoli));
    }
}

在json中的返回值如下:

[{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]},{"id":40,"tipo":"MENU","dataora":"2020-06-10T15:56:47","sent":false,"cfg":1,"articoli":[{"id":132,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[]},{"id":133,"tipo":"PLUREP","cod":"REPARTO 0019","qta":1,"id_ordine":40,"varianti":[]},{"id":134,"tipo":"PLUREP","cod":"REPARTO 0018","qta":1,"id_ordine":40,"varianti":[]},{"id":135,"tipo":"PLUREP","cod":"REPARTO 0037","qta":1,"id_ordine":40,"varianti":[]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]},{"id":136,"tipo":"PLUREP","cod":"CAFFE","qta":1,"id_ordine":40,"varianti":[{"cod":"VAR0001","id_articolo":136},{"cod":"VAR0002","id_articolo":136},{"cod":"VAR0003","id_articolo":136}]}]}]

虽然它只需要创建 1 个包含所有项目的数组项目...

那么问题是如何按数据表正确分组?

【问题讨论】:

  • 为什么不在数据库端这样做,例如编写一个 sql 查询并返回所需的数据表示形式?
  • @PavelAnikhouski 最初我是通过编写 sql 查询来完成的,但我必须运行多个选择(选择所有订单然后循环抛出所有订单并选择它的项目,然后循环抛出所有项目并选择它是变体),我认为使用数据表会更好地提高性能,所以我只是加入了三个表并将它们填充到数据表中
  • 来自:var varianti = dt.AsEnumerable().Where(r => r.Field("ID_ART_VAR") == id_articolo); To : var varianti = articolo.Where(r => r.Field("ID_ART_VAR") == id_articolo);您不需要枚举整个 DataTable。 articoli 是一个 List

标签: c# linq datatable


【解决方案1】:

看来我必须在.GroupBy 之后使用.Select 并将分组的dt 复制到一个新的dt 中,所以使用.GroupBy 的代码来自

var ordini = dt.AsEnumerable().GroupBy(r => r.Field<int>("ID_OR"));

现在看起来像这样:

        var ordini = dt.AsEnumerable()
            .GroupBy(r => r.Field<int>("ID_OR"))
            .Select(g => g.First()).CopyToDataTable();

我通过将 foreach 减少到 3 而不是之前的 5 来更改整个代码,因为我可以立即在 ordini 中使用 DataRow

var ordini = dt.AsEnumerable()
    .GroupBy(r => r.Field<int>("ID_OR"))
    .Select(g => g.First()).CopyToDataTable();
foreach (DataRow ordine in ordini.Rows)
{
    int id_ordine = (int)ordine["ID_OR"];
    List<Ordine.Articoli> list_articoli = new List<Ordine.Articoli>();
    var articoli = dt.AsEnumerable()
        .Where(r => r.Field<int>("ID_OR_ART") == id_ordine)
        .GroupBy(r => r.Field<int>("ID_ART"))
        .Select(g => g.First()).CopyToDataTable();
    foreach (DataRow articolo in articoli.Rows)
    {
        int id_articolo = (int)articolo["ID_ART"];
        List<Ordine.Varianti> list_varianti = new List<Ordine.Varianti>();
        var varianti = dt.AsEnumerable().Where(r => r.Field<int?>("ID_ART_VAR") == id_articolo);
        foreach (DataRow variante in varianti)
        {
            list_varianti.Add(new Ordine.Varianti((string)variante["COD_VAR"], id_articolo));
        }
        list_articoli.Add(new Ordine.Articoli(id_articolo, (string)articolo["TIPO_ART"], (string)articolo["COD_ART"], (float)articolo["QTA_ART"], (int)articolo["ID_OR_ART"], list_varianti));
    }
    list_ordini.Add(new Ordine(id_ordine, (string)ordine["TIPO_OR"], (DateTime)ordine["ORA_OR"], Convert.ToBoolean((ulong)ordine["SENT_OR"]), (int)ordine["ID_OR_CFG"], list_articoli));
}

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    相关资源
    最近更新 更多