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

时间:2011-05-18 17:27:38

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

我有一个数据库查询,它以平面格式返回分层数据。例如客户,订单和订单商品(仅举例,我的数据不同)。如何将其转换为分层对象集合,即客户对象的集合,其中每个客户对象具有订单对象的集合,并且每个订单对象具有订单项对象的集合。它只是循环遍历每个项目并手动构建对象层次结构的情况还是有更好的方法来实现这一点吗?我不使用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订单3 OI5 OrderItem5
C2 Cust2 O3 Order3 OI6 OrderItem6
C2 Cust2 O4订单4 OI7订单7 C2 Cust2 O4 Order4 OI8 OrderItem8

3 个答案:

答案 0 :(得分:3)

首先,结果集必须处于正确的排序状态。 这意味着,客户必须先接受订单,并且必须在订单商品之前的结果集中。

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

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

元代码:

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

答案 1 :(得分:2)

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

您对ValueInjecter的使用与

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

Full details of this unflattening example

答案 2 :(得分:0)

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