【发布时间】:2010-01-06 15:27:31
【问题描述】:
场景
我需要从给定规范的对象列表中构建数据表。例如,我有一个 Order 对象的列表/数组,以及一个详细说明数据表应包含的内容的字符串规范,例如“ID;Date;Customer.ID;Customer.Name;Orderlines.Product.ID;Orderlines.Quantity;Orderlines。单价”。
order 类包含 Orderlines 的列表(详细信息),Orderline 类包含对 Product 的引用等。一个非常面向对象的设计。
我需要创建一个通用过程,它采用对象列表和字符串规范,然后找到所有连接。例如 AddToDataTableWithJoins(DataTable table, object[] objects, string specification)。
如果数组中存在两个订单,每个订单包含三个订单行,则结果将是一个包含 6 行的数据表。
例如
{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 对象)。
- 对于根对象中的每个属性,将不涉及一对多关系的每个属性的值存储在一个数组中。
- 使用递归并遍历复制数组的子集合中的每个对象。
- 到达最外面的“节点”时,在 DataTable 中添加一个新行。
这些观点可能会被修改,因为它们只是在这一点上的想法,但我认为我已经接近了一些东西。
谢谢, 斯蒂芬
【问题讨论】:
-
我假设您想构建这些 DataTable 对象之一以放在“DataGridView”后面(已针对与 DataTable 一起使用进行了优化)。
标签: c# reflection join union