投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/4/16 20:56:30
まずは最初の例から。

> Dim tbl As New DataTable()
grouplist を列挙して、fruit, aminal, flower 用に、それぞれの別の DataTable を作成しています。
このループ処理により、下記の 3 つのテーブルが生成されます。

   🍎🍌🍓   🐶😺🐰   🌹💐🌼
┏━┯━━━┓┏━┯━━━┓┏━┯━━━┓
┃ID│fruit ┃┃ID│animal┃┃ID│flower┃
┣━┿━━━┫┣━┿━━━┫┣━┿━━━┫
┃ 0│リンゴ┃┃ 0│イヌ  ┃┃ 0│バラ  ┃
┃ 1│バナナ┃┃ 1│ネコ  ┃┃ 1│ユリ  ┃
┃ 2│イチゴ┃┃ 2│ウサギ┃┃ 2│キク  ┃
┗━┷━━━┛┗━┷━━━┛┗━┷━━━┛

『ID』列が追加されていますが、これはテーブルの各行を識別するための「主キー」です。
これは、下記のコードで生成されています。

> tbl.Columns.Add("ID", GetType(Long)).AutoIncrement = True
> tbl.PrimaryKey = New DataColumn() {tbl.Columns(0)}

ID 列の値は自分で代入していっても良いのですが、ここでは AutoIncrement を
用いてます。これを使うと、新しい行が追加されるたびに自動採番してくれます。


> jsonDataTable.Merge(tbl, False, MissingSchemaAction.AddWithKey)
作成されたテーブルは、jsonDataTable にマージしていき、下記の表を作ります。
Merge メソッドに指定してある AddWithKey が肝となっており、これによって
主キーが一致するデータを同一行とみなして結合してくれます。

┏━┯━━━┯━━━┯━━━┓
┃ID│fruit │animal│flower┃
┣━┿━━━┿━━━┿━━━┫
┃ 0│リンゴ│イヌ  │バラ  ┃
┃ 1│バナナ│ネコ  │ユリ  ┃
┃ 2│イチゴ│ウサギ│キク  ┃
┗━┷━━━┷━━━┷━━━┛



> jsonDataTable.PrimaryKey = Nothing
> jsonDataTable.Columns.RemoveAt(0)
最終結果に ID 列は不要なので、最後に取り除きます。
削除前には、PrimaryKey としての割り当てを解除しておく必要があります。