シナリオ
指定されたオブジェクトのリストからデータのテーブルを作成する必要があります。例では、Order オブジェクトのリスト/配列と、データ テーブルに何を含める必要があるかを詳細に示す文字列仕様があります (例: "ID;Date;Customer.ID;Customer.Name;Orderlines.Product.ID;Orderlines.Quantity;Orderlines.単価"。
注文クラス クラスには、注文行のリスト (詳細) が含まれ、注文行クラスには製品への参照などが含まれます。非常にオブジェクト指向の設計です。
オブジェクトのリストと文字列仕様を取得し、すべての結合を検索する汎用プロシージャを作成する必要があります。例: AddToDataTableWithJoins(DataTable テーブル、object[] オブジェクト、文字列仕様)。
配列に 2 つの注文があり、それぞれに 3 つの注文行がある場合、結果は 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"
。
次に、次のアプローチを使用する必要があると思います。
- 1 つ以上の 1 対多の関係を含むブランチを決定します。
- コレクション内のすべてのルート オブジェクト (Order オブジェクト) をトラバースします。
- ルート オブジェクトのすべてのプロパティについて、1 対多の関係に関係しないすべてのプロパティの値を配列に格納します。
- 再帰を使用して、配列をコピーする子コレクション内のすべてのオブジェクトをトラバースします。
- 最も外側の「ノード」に到達したら、DataTable に新しい行を追加します。
これらの点は現時点での考えなので修正されるかもしれませんが、私は何かに近いと思います.
ありがとう、ステファン