преобразовать плоский набор результатов базы данных в иерархическую коллекцию объектов в C # - PullRequest
7 голосов
/ 18 мая 2011

У меня есть запрос к базе данных, который возвращает иерархические данные в плоском формате. например, клиенты, заказы и элементы заказа (просто пример, мои данные отличаются). как я могу преобразовать его в иерархическую коллекцию объектов, т. е. коллекцию объектов заказчика, где каждый объект клиента имеет коллекцию объектов заказа, а каждый объект заказа имеет коллекцию объектов позиции заказа. Это просто случай прохождения каждого элемента и построения иерархии объектов вручную ИЛИ есть ли лучший способ добиться этого? Я не использую LINQ. Я получаю данные из хранимой процедуры базы данных SQL-сервера. Изменить: я не использую 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

Ответы [ 3 ]

3 голосов
/ 19 мая 2011

Во-первых, набор результатов должен быть в правильном порядке.Это означает, что клиент должен предшествовать заказам, и они должны быть в наборе результатов перед позициями заказа.Знание, что вам нужно перебирать коллекцию только один раз.

Мета-код:

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 голосов
/ 18 мая 2011

Я бы рекомендовал использовать инструмент отображения, в частности ValueInjecter . ValueInjecter поддерживает разглаживание данных.

Ваше использование ValueInjecter будет аналогично

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

Полная информация об этом неубедительном примере

0 голосов
/ 18 мая 2011

Вы не говорите, как вы используете это (возможно, привязку к элементам управления, которые знают о связях?), Но если вы привязаны к использованию ADO.NET, поместите результаты в отдельные таблицы в DataSet и добавьтеотношения данных, которые определяют отношения между таблицами.Он работает почти так же, как ссылки на внешние ключи в базе данных, и элементы управления, которые поддерживают отношения, будут использовать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...