【问题标题】:convert a flat database resultset into hierarchical object collection in C#在 C# 中将平面数据库结果集转换为分层对象集合
【发布时间】:2011-05-18 17:27:37
【问题描述】:

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

CustId CustName OrderId OrderName OrderItemId OrderItemName
C1 Cust1 O1 Order1 OI1 OrderItem1
C1 Cust1 O1 Order1 OI2 OrderItem2
C1 Cust1 O2 Order2 OI3 OrderItem3
C1 Cust1 O2 Order2 OI4 OrderItem4
C2 Cust2 O3 Order3 OI5 OrderItem5
C2 Cust2 O3 Order3 OI6 OrderItem6
C2 Cust2 O4 Order4 OI7 OrderItem7
C2 Cust2 O4 Order4 OI8 OrderItem8

【问题讨论】:

  • 您是否在一次查询中选择此数据?一个结果集??
  • 是的,我在一个查询中选择数据,我不想为每个父母单独调用数据库来获取孩子
  • 那么如何区分客户、订单和订单商品?
  • @BitKFu,请查看示例数据

标签: c# sql-server linq c#-4.0


【解决方案1】:

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

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

有了这些知识,您只需遍历集合一次。

元代码:

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);
}

【讨论】:

  • 我添加了示例数据,希望现在清楚,上述解决方案不适用于示例数据。谢谢。
  • 我调整了这个例子。但是提醒一下:它只是元代码,所以如果不进行一些更改就无法编译。
【解决方案2】:

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

您对 ValueInjecter 的使用将类似于

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

Full details of this unflattening example

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我没有将此数据绑定到任何控件,此数据由一些其他组件使用,该组件期望数据作为具有父子关系的对象集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多