以下のようにJOBというテーブルと、PERSONというテーブル情報がXMLにあり、これをDataSetに取り込んだとします。
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその1</ITEM>
</JOB>
<JOB>
<PERSON_ID>2</PERSON_ID>
<ITEM>アイテムその2</ITEM>
</JOB>
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその3</ITEM>
</JOB>
<JOB>
<PERSON_ID>3</PERSON_ID>
<ITEM>アイテムその4</ITEM>
</JOB>
<PERSON>
<PERSON_ID>1</PERSON_ID>
<PERSON_NAME>山田</PERSON_NAME>
</PERSON>
<PERSON>
<PERSON_ID>2</PERSON_ID>
<PERSON_NAME>田中</PERSON_NAME>
</PERSON>
このとき、SQLでいうところの、以下のような結合データをDataTableとして取得したいのです。
SELECT JOB.PERSON_ID, JOB.ITEM, PERSON.PERSON_NAME
FROM JOB LEFT JOIN PERSON ON JOB.PERSON_ID = PERSON.PERSON_ID
DataSetにはRelationsというものがあるとのことですが、具体的にどのようにすればよいか、お教え頂けないでしょうか?
使用しているVBは2008です。
よろしくお願い申し上げます。
リレーションを使うなら、これでどうでしょう。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
DataGridView1.DataSource = GetSample()
DataGridView1.DataMember = "JOB"
End Sub
Function GetSample() As DataSet
Dim ds As New DataSet()
ds.ReadXml(J.CreateReader(), XmlReadMode.InferSchema)
ds.ReadXml(P.CreateReader(), XmlReadMode.InferSchema)
ds.Tables("PERSON").PrimaryKey = New DataColumn() {ds.Tables("PERSON").Columns("PERSON_ID")}
ds.Relations.Add("JOIN", ds.Tables("PERSON").Columns("PERSON_ID"), ds.Tables("JOB").Columns("PERSON_ID"), False)
ds.Tables("JOB").Columns.Add("PERSON_NAME", GetType(String), "Parent.PERSON_NAME")
Return ds
End Function
Dim J = <JOBS>
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその1</ITEM>
</JOB>
<JOB>
<PERSON_ID>2</PERSON_ID>
<ITEM>アイテムその2</ITEM>
</JOB>
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその3</ITEM>
</JOB>
<JOB>
<PERSON_ID>3</PERSON_ID>
<ITEM>アイテムその4</ITEM>
</JOB>
</JOBS>
Dim P = <PEOPLE>
<PERSON>
<PERSON_ID>1</PERSON_ID>
<PERSON_NAME>山田</PERSON_NAME>
</PERSON>
<PERSON>
<PERSON_ID>2</PERSON_ID>
<PERSON_NAME>田中</PERSON_NAME>
</PERSON>
</PEOPLE>
Linq を使って結合するという手も。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim ds = GetSample()
Dim q = From R1 In ds.Tables("JOB") Group Join R2 In ds.Tables("PERSON") _
On R1.Field(Of String)("PERSON_ID") Equals R2.Field(Of String)("PERSON_ID") _
Into RightTableResults = Group _
From G In RightTableResults.DefaultIfEmpty() _
Select PERSON_ID = R1.Field(Of String)("PERSON_ID"), _
ITEM = R1.Field(Of String)("ITEM"), _
PERSON_NAME = If(G Is Nothing, "(未定義)", G!PERSON_NAME)
DataGridView1.DataSource = q.ToArray()
End Sub
Function GetSample() As DataSet
Dim ds As New DataSet()
ds.ReadXml(J.CreateReader(), XmlReadMode.InferSchema)
ds.ReadXml(P.CreateReader(), XmlReadMode.InferSchema)
Return ds
End Function
Dim J = <JOBS>
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその1</ITEM>
</JOB>
<JOB>
<PERSON_ID>2</PERSON_ID>
<ITEM>アイテムその2</ITEM>
</JOB>
<JOB>
<PERSON_ID>1</PERSON_ID>
<ITEM>アイテムその3</ITEM>
</JOB>
<JOB>
<PERSON_ID>3</PERSON_ID>
<ITEM>アイテムその4</ITEM>
</JOB>
</JOBS>
Dim P = <PEOPLE>
<PERSON>
<PERSON_ID>1</PERSON_ID>
<PERSON_NAME>山田</PERSON_NAME>
</PERSON>
<PERSON>
<PERSON_ID>2</PERSON_ID>
<PERSON_NAME>田中</PERSON_NAME>
</PERSON>
</PEOPLE>
魔界の仮面弁士様に最初に示して頂きました、リレーションを使用する方法で、目的のDataTableを取得できました。
魔界の仮面弁士様、ありがとうございました。
解決しました。
編集 削除