【发布时间】: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