数据表离开加入linq

时间:2012-06-01 20:19:56

标签: vb.net linq join dataset

我很难加入2个数据表并拥有连接的数据表 结果。

第一个数据表(标签)包含包含printerid的数据。 第二个数据表(打印机)保存打印机参考(id> unc)

我想将所有数据作为endresult(加入​​)数据表 从第一个数据表与第二个数据表的字段(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 -

3 个答案:

答案 0 :(得分:1)

您是否尝试过http://msdn.microsoft.com/en-us/library/system.linq.enumerable.join.aspx

使您的数据表成为IEnumerable的扩展(就像您所做的那样),并且linq中的连接可以使其轻松工作。

然后将连接的表格发送到您想要的任何目的地。

答案 1 :(得分:1)

我认为评论会更难理解,所以我把它移到了帖子里。

我写了一些结构,可以帮助你理解Join的工作方式:

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

structure Printer
    Public unc as string
end structure

如果您将标签和打印机设置为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 

然而,我今天早上在记事本中使用它,所以你可能需要调整它。我只想补充说,你必须拥有相同类型的容器才能使用连接(例如:Join at msdn中他们使用2个列表的例子。),它们与Linq obects兼容(我不知道数据表)。

答案 2 :(得分: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