SQL Server - 在 C# 中将平面数据库结果集转换为分层对象集合

本文关键字:转换 结果 分层 集合 对象 数据库 平面 Server SQL | 更新日期: 2023-09-27 17:57:07

我有一个数据库查询,它以平面格式返回分层数据。 例如客户,订单和订单项目(只是一个例子,我的数据是不同的)。 如何将其转换为分层对象集合,即客户对象的集合,其中每个客户对象都有一个订单对象的集合,每个订单对象都有一个订单项目对象的集合。只是遍历每个项目并手动构建对象层次结构的情况,还是有更好的方法来实现这一目标?我没有使用LINQ。我从 SQL 服务器数据库存储过程中获取数据。编辑:我没有使用 LINQ 从数据库中检索数据,但如果可以解决问题,我可以使用它来操作检索后的数据以将其转换为所需的格式。
编辑:示例数据如下所示(通过连接客户,订单和订单项目表检索)(抱歉格式不佳,我不知道如何在编辑器中格式化)

CustId CustName OrderId OrderName OrderItemId OrderItemName
C1 客户1 O1 订单1 OI1 订单项目1
C1 客户1 O1 订单1 OI2 订单项目2
C1 客户1 O2 订单2 OI3 订单项3
C1 客户1 O2 订单2 OI4 订单项目4
C2 客户2 O3 订单3 OI5 订单项目5
C2 客户2 O3 订单3 OI6 订单项6
C2 客户2 O4 订单4 OI7 订单项目7
C2 客户2 O4 订单4 OI8 订单项8

SQL Server - 在 C# 中将平面数据库结果集转换为分层对象集合

首先,结果集必须按正确的顺序排列。这意味着,客户必须在订单之前出现,并且他们必须在订单项之前出现在结果集中。

排序:客户->订单->订单

项目

有了这些知识,您只需循环访问集合一次。

元代码:

foreach (item in resultset)
{
  // Build a customer and order dictionary
  if (!CustomerDictionary.Contains(item.Customer.Id)
     CustomerDictionary.Add(item.Customer.Id, item.Customer)
  if (!OrderDictionary.Contains(item.Order.Id)
     OrderDictionary.Add(item.Order.id, item.Order)
  // Now add the association      
  var customer = CustomerDictinoary[item.Customer.Id];
  customer.AddOrder(item.Order);
  var order = OrderDictinoary[item.Order.id];
  order.AddOrderItem(item.OrderItem);
}

我建议使用映射工具,特别是ValueInjecter。ValueInjecter 支持非平展数据。

您对 ValueInjecter 的使用将类似于

var unflat = new Foo();
unflat.InjectFrom<UnflatLoopValueInjection>(flat);

此未展平示例的完整详细信息

您没有说明如何使用此功能(也许绑定到知道关系的控件?),但是如果您与使用 ADO.NET 绑定,请将结果放入 DataSet 中的单独表中,并添加定义表之间关系的数据关系。它的工作方式与数据库中的外键引用非常相似,并且具有关系感知的控件将使用这些控件。