我很难加入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 -
答案 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