заполнить граф объекта из базы данных - PullRequest
0 голосов
/ 04 мая 2010

Я хотел бы знать, как лучше всего заполнить объект, который имеет коллекцию дочерних объектов, и каждый дочерний объект может inturn иметь коллекцию объектов из базы данных, не делая многократных обращений к базе данных, чтобы получить дочерние объекты для каждого объекта , в основном в иерархическом формате, например, у клиента есть заказы, а у каждого заказа есть позиции заказа. лучше всего получить данные в формате XML (SQL Server 2005) или получить набор данных, соединив связанные таблицы вместе, а затем сопоставить эти данные с объектом? заранее спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 04 мая 2010

Есть еще много переменных:

  1. Дочерние объекты одного типа? Если это так, вы можете выбрать их все одновременно, а затем установить отношения родитель / потомок в слое сопоставления объектов.
  2. Могут ли дочерние объекты иметь собственных детей? Если вложение не ограничено, вы не сможете получить все данные одновременно, если не получите все данные.

Вы, конечно, могли бы объединить все клиенты-> заказы-> элементы заказа и разбить все на части в коде, но, похоже, это потребовало бы много времени в дублированных родительских строках и много работы при обработке этот большой беспорядок.

Попытка избежать нескольких вызовов может быть преждевременной оптимизацией. У вас проблемы с производительностью при слишком большом количестве обращений к базе данных?

Редактировать: Основываясь на ваших комментариях, вы сможете выполнить один запрос на уровень иерархии:

Select * from orders 
where orders.customerid = my_customer_id

- Выполнить некоторые сопоставления orm и составить список идентификаторов дочерних объектов -

Select * from child_order_object 
where child_order_object_id in (list of child object ids)

- сделать еще несколько сопоставлений ORM и связать дочерние объекты с предыдущими родительскими объектами -

...

- Повторите для других уровней -

Вы должны иметь возможность иметь только один запрос на уровень взаимосвязи, а не растущее количество запросов, чтобы получить только один объект по идентификатору.

1 голос
/ 04 мая 2010

Вы можете взглянуть на ORM s, например NHibernate и Entity Framework , которые предназначены именно для таких сценариев.

0 голосов
/ 14 марта 2016

Этот вопрос старый, но новый ответ (если вы используете платформу сущностей) заключается в использовании метода Include в запросе объекта. Это с готовностью загрузит все указанные свойства навигации.

https://msdn.microsoft.com/en-us/library/bb738708(v=vs.100).aspx

0 голосов
/ 04 мая 2010

MS SQL 2005 поддерживает Common Table Expressions, которые могут использоваться для этой цели. В основном они позволяют делать рекурсивный запрос. Выполните поиск по ключевым словам в CTE / MS SQL, и вы найдете много таких вещей: Применение рекурсивного CTE к строкам сгруппированных таблиц (SQL Server 2005)

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