Сценарий
Мне нужно построить таблицу данных из списка объектов с учетом спецификации. Например, у меня есть список / массив объектов Order и спецификация строки, подробно описывающая, что должна содержать таблица данных, например "ID; Дата; Customer.ID; Customer.Name; Orderlines.Product.ID; Orderlines.Quantity; Orderlines. UnitPrice».
Класс класса заказа содержит список (данные) Orderlines, а класс Orderline - ссылку на Продукт и так далее. Очень объектно-ориентированный дизайн во всех отношениях.
Мне нужно создать общую процедуру, которая берет список объектов и спецификацию строки, а затем находит все объединения. E.g AddToDataTableWithJoins (таблица DataTable, объекты object [], спецификация строки).
Если в массиве существует два порядка, каждый с тремя линиями порядка, результатом будет таблица данных с 6 строками.
1011 * например *
{1,'2009-12-12 00:00',14,'John','DRY14',12.00,19.99}
{1,'2009-12-12 00:00',14,'John','DRY15',9.00,12.00}
{1,'2009-12-12 00:00',14,'John','DRY16',3,3.00}
{2,'2009-12-13 00:00',17,'Mike','ALR',10.00,16.00}
{2,'2009-12-13 00:00',17,'Mike','BBR',1.00,11.50}
{2,'2009-12-13 00:00',17,'Mike','PPQ',4,6.00}
Но опять же, класс Order может иметь более одного списка (подробности), и я должен признать, что, хотя я знаком с рефлексией и простой рекурсией, я в растерянности по этому поводу.
Любые советы о том, как создать этот алгоритм, будут высоко оценены.
Идеи
Должно быть введено ограничение, чтобы на каждом уровне спецификации существовало не более одного списка, а в другой ветви не было ни одного списка. Например, если класс Customer определил список объектов Order, следующая спецификация не может быть разрешена: "ID;Date;Customer.ID;Customer.Orders.ID;Orderlines.Product.ID"
.
Тогда я считаю, что должен использоваться следующий подход:
- Определите ветвь, которая содержит одно или несколько отношений «один ко многим».
- Обход каждого корневого объекта в коллекции (объектов Order).
- Для каждого свойства в корневом объекте сохраняйте значения каждого свойства, не участвующего в отношениях «один ко многим», в массиве.
- Использовать рекурсию и обходить каждый объект в дочерней коллекции, копируя массив.
- При достижении самого внешнего «узла» добавьте новую строку в таблицу данных.
Эти пункты могут быть пересмотрены, поскольку на данный момент они всего лишь мысли, но я думаю, что я близок к чему-то.
Спасибо,
Stefan