DataSet内のDataTableを結合したものを取得するには?

解決


チョウサン  2009-12-07 22:29:17  No: 142941

以下のように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です。
よろしくお願い申し上げます。


魔界の仮面弁士  2009-12-08 22:55:48  No: 142942

リレーションを使うなら、これでどうでしょう。

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>


魔界の仮面弁士  2009-12-08 23:30:51  No: 142943

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>


チョウサン  2009-12-09 01:27:19  No: 142944

魔界の仮面弁士様に最初に示して頂きました、リレーションを使用する方法で、目的のDataTableを取得できました。
魔界の仮面弁士様、ありがとうございました。


チョウサン  2009-12-09 01:28:09  No: 142945

解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加