0

2 つのデータテーブルを結合するのに苦労しており、結果としてデータテーブルが結合されています。

最初のデータテーブル (ラベル) は、printerid を含むデータを保持します。2 番目のデータテーブル (printers) には、プリンター参照 (id > unc) が保持されます。

2番目のデータテーブルのフィールド(unc)を持つ最初のデータテーブルからのすべてのデータを含むデータテーブルを最終結果(結合)として持ちたいと思います。

これは私が試してきたことです:(固定パスは便宜上であることに注意してください...)

Sub Main()

    Dim ds1 As new DataSet

    ds1.ReadXml("C:\Program Files (x86)\[COMPANY]\ASW2XML\BICOLOR_a07bfc62-501e-4444-9b6e-3b9d3550e1a4.xml")

    Dim ds2 As New DataSet

    Dim li As string()

    li = IO.File.ReadAllLines("C:\Program Files (x86)\[COMPANY]\ASW2XML\printers.dat")

    Dim printers As New DataTable("Printers")

    printers.Columns.Add("REPRT2")
    printers.Columns.Add("REPRT3")

    For Each s In li.ToList

        Dim dr As DataRow = printers.NewRow

        dr.Item(0) = s.Split("=")(0)
        dr.Item(1) = s.Split("=")(1)

        printers.Rows.Add(dr)

    Next

    printers.AcceptChanges

    Dim labels As DataTable = ds1.Tables(0)

    Dim joined As new DataTable("data")

        'Dim lnq = From label In labels.AsEnumerable Join printer In printers.AsEnumerable On label("REPRT") Equals printer("REPRT2") Select printer
        'Dim lnq = From l In labels Group Join p In printers On l Equals p("REPRT2") Into Group From p In Group Select label = l, ppath = If(p Is Nothing, "(Nothing)", p("REPRT3"))
        Dim lnq = labels.AsEnumerable().Where(Function(o)printers.Select("REPRT2 =" & o.Item("REPRT").ToString).Length = 0)

        joined = lnq.CopyToDataTable


End Sub

あなたの助けとインスピレーションをありがとう!

grtz-S-

4

3 に答える 3

1

コメントだと分かりにくいと思ったので、投稿に移動しました。

Join がどのように機能するかを理解するのに役立つように、少し構造を書きました。

structure Label
    Public printerId as long
    Public driver as Strring
end structure

structure Printer
    Public unc as string
end structure

Labels and Printers を (以下の構造ではなく) DataTable に設定すると、次のようになります。

 function DoJoin() as datatable 
    'You might remove as datatable in query declaration
    dim query as datatable = Labels.Join(Printers, Function(aLabel) aLabel, _
    function(aPrinter) aPrinter.unc, _
    function(aLabel, aPrinter) New With  
    { .printerID = aLabel.printerId, .driver = aLabel.Driver, _
      .unc = aPrinter.unc
    })
    return query 
end function 

ただ、今朝メモ帳に書いたので、調整が必要かもしれません。結合を使用するには、同じタイプのコンテナーが必要であることを追加したいだけです (例: msdnでの結合では、2 つのリストを使用しました)。これは、Linq オブジェクト (データテーブルがわからない) と互換性があります。

于 2012-06-04T14:43:37.400 に答える
1

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.join.aspxを試しましたか

データテーブルをIEnumerableの拡張として作成し(リストのように)、linqで結合すると簡単に機能します。

次に、結合されたテーブルを任意の宛先に送信します。

于 2012-06-01T20:48:10.203 に答える
0

私はそれを「難しい」方法で行い、親テーブルのすべての行をループすることにしました。これは、少量のレコードでは非常に高速になります。これを大量のレコードで実行すると、Linqソリューションを使用した場合よりも速度が大幅に低下するかどうかはわかりません...

これは私がatmを使用しているコードです:

Sub Main()

    Dim ds As new DataSet

    ds.ReadXml("C:\Program Files (x86)\[COMPANY]\ASW2XML\BICOLOR_a07bfc62-501e-4444-9b6e-3b9d3550e1a4.xml")

    Dim labels As DataTable = ds.Tables(0)
    Dim printers As DataTable = GetPrinters

    labels.Columns.Add("REPRT2").SetOrdinal(labels.Columns.IndexOf("REPRT")+1) 'insert new column after key column
    labels.CaseSensitive=False
    labels.AcceptChanges

    For Each dr As DataRow In labels.Rows

        Dim p As String = String.Empty

        Try
            p = printers.Select("ID='" & dr("REPRT") & "'")(0).Item("PATH").ToString
        Catch ex As Exception

        End Try

        dr("REPRT2") = p

    Next

    labels.AcceptChanges

End Sub

Function GetPrinters As DataTable

    Dim printers As New DataTable("Printers")

    Dim li As string()

    li = IO.File.ReadAllLines("C:\Program Files (x86)\[COMPANY]\ASW2XML\printers.dat")

    printers.Columns.Add("ID")
    printers.Columns.Add("PATH")

    For Each s In li.ToList

        Dim dr As DataRow = printers.NewRow

        dr.Item(0) = s.Split("=")(0)
        dr.Item(1) = s.Split("=")(1)

        printers.Rows.Add(dr)

    Next

    printers.AcceptChanges

    Return printers

End Function
于 2012-06-02T09:34:26.427 に答える