如何使用 vb.net 从第二个源数据表查找到第一个数据表

How to lookup from the second source datatable to the first datatable with vb.net

提问人:roy 提问时间:8/2/2023 更新时间:8/7/2023 访问量:70

问:

如何使用 vb.net 从第二个源数据表查找到第一个数据表。

如果可能,是否可以应用查找数据表?请指导我

谢谢

 Private table1 As New DataTable
    Private table2 As New DataTable
    Protected Overrides Sub OnLoad(e As EventArgs)
        MyBase.OnLoad(e)
        '_myTable = New DataTable
        table1.Columns.AddRange({
        New DataColumn("Column1", GetType(String)),
        New DataColumn("Column2", GetType(String)),
        New DataColumn("Column3", GetType(String)),
        New DataColumn("Size", GetType(String)),
        New DataColumn("Qty", GetType(Integer))
    })
        table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25)
        table1.Rows.Add("TEST 2000", "TEST", "BHTF15", "S", 55)
        table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "M", 65)
        table1.Rows.Add("TEST 1000", "TEST", "BHTF25", "6L", 10)
        table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "S", 12)
        DataGridView1.DataSource = table1
    End Sub
    Private Sub createtabletwo()

        table2.Columns.AddRange({
        New DataColumn("Size", GetType(String)),
        New DataColumn("SizePriority", GetType(Integer))
    })
        table2.Rows.Add("5L", 13)
        table2.Rows.Add("S", 2)
        table2.Rows.Add("M", 3)
        table2.Rows.Add("6L", 15)
        table2.Rows.Add("3L", 9)

    End Sub

期望的结果

列 1 专栏 2 专栏 3 大小 数量 大小优先级
测试 3000 测试 BHTF10型 5升 25 13
测试 2000 测试 BHTF15型 S 55 2
测试 3000 测试 BHTF10型 M 65 3
测试 1000 测试 BHTF25型 6升 10 15
测试 3000 测试 BHTF10型 S 12 2
vb.net LINQ Select DataTable 查找

评论

0赞 Jimi 8/2/2023
看起来您要合并两个表,而不保留架构中具有匹配项的列。可以使用 (或 ),但需要两个表中值匹配的 PrimaryKey[DataTable1].Merge([DataTable2], false, MissingSchemaAction.AddWithKey)MissingSchemaAction.Add
0赞 roy 8/2/2023
@Jimi,谢谢你的回复,我是这样创建的,我应该按照你的意思在哪个位置创建主键table1.Merge([table2], False, MissingSchemaAction.AddWithKey) DataGridView1.DataSource = table1
0赞 Jimi 8/2/2023
例如,将 Column 作为 添加到每个 DataTable(对于另一个 DataTable 相同)New DataColumn("Item_Id", GetType(Long)) With {.AutoIncrement = True, .AutoIncrementSeed = 0, .AutoIncrementStep = 1}table1.PrimaryKey = {table1.Columns("Item_Id")}
0赞 roy 8/2/2023
@Jimi,感谢您的回复,对于手动数据表添加行,就像这样的代码,所以我必须这样做,因为有一个错误。table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25) Additional information: Input string was not in a correct format.Couldn't store <TEST 3000> in Item_Id Column. Expected type is Int64.
0赞 Jimi 8/2/2023
您必须指定为与 PrimaryKey 列对应的值。它是一个自动递增的列,它会自动填充,但该位置需要一个占位符来遵守列的顺序Nothing.Rows.Add()

答:

1赞 Hursey 8/7/2023 #1

如果只想使用一个简单的决策树,那就没什么太复杂的了。事实上,我几乎可以说,看看你之前发布的问题和答案,你已经知道如何做到这一点,你需要实际应用别人给你的逻辑和学习。Select Case

    Dim table1 As New DataTable("Players")
    table1.Columns.Add(New DataColumn("ProductCode", GetType(String)))
    table1.Columns.Add(New DataColumn("Remark", GetType(String)))
    table1.Columns.Add(New DataColumn("ColorCode", GetType(String)))
    table1.Columns.Add(New DataColumn("Size", GetType(String)))
    table1.Columns.Add(New DataColumn("Qty", GetType(Integer)))
    table1.Columns.Add(New DataColumn("SizePriority", GetType(Integer)))
    table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "5L", 25)
    table1.Rows.Add("TEST 2000", "TEST", "BHTF15", "S", 55)
    table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "M", 65)
    table1.Rows.Add("TEST 1000", "TEST", "BHTF25", "6L", 10)
    table1.Rows.Add("TEST 3000", "TEST", "BHTF10", "S", 12)

    For Each row As DataRow In table1.Rows

        Select Case row("Size").ToString()
            Case "XS"
                row("SizePriority") = 1
            Case "S"
                row("SizePriority") = 2
            Case "M"
                row("SizePriority") = 3
            Case "L"
                row("SizePriority") = 4
            Case "XL"
                row("SizePriority") = 5
            Case "XXL"
                row("SizePriority") = 6
            Case "2L"
                row("SizePriority") = 7
            Case "3L"
                row("SizePriority") = 8
            Case "4L"
                row("SizePriority") = 9
            Case "5L"
                row("SizePriority") = 10
            Case Else
                row("SizePriority") = 11
        End Select
        row.AcceptChanges()
    Next


    Dim table1View As New DataView(table1)
    table1View.Sort = "ProductCode Desc, ColorCode, SizePriority"
    For Each row As DataRowView In table1View
        Console.WriteLine($"{row(0)}, {row(1)}, {row(2)}, {row(3)}, {row(4)}, {row(5)}")
    Next

没有什么比这更复杂的了。当然,您可以使用 lamda/linq 表达式来执行此操作,但这是一种冗长的方法。替代方案,由于 SizePriority 表在现实生活中可能较小(我猜),因此切换它可能是更好的性能。迭代 Size Priority 表,使用 Where 子句更新 Table1。我现在对它的确切语法有点模糊,所以要把它留在那里,如果你想研究它,这取决于你。

如果您希望将其作为数据库中的查询来执行,则只需一个简单的联接即可。没有比这更复杂的了,您甚至可以考虑在该查询上使用 Order By 子句,这将使这个问题和上一个问题变得多余。

Select
    <order>.Code,
    <order>.Name,
    <order>.ColorCode,
    <order>.Size,
    <order>.Quantity,
    <SizePriority>.Priority
From <Order>
    Inner Join <SizePriority> ON <SizePriority>.Size = <Order>.Size
Order By Code Desc, ColorCode, Priority

请注意,我不知道您的数据库架构,因此我使用了 并且作为占位符,您需要将它们替换为您的实际表名,无论它们是什么。您可能还需要一些 where 条件来过滤结果。<order><SizePriority>

评论

0赞 roy 8/7/2023
谢谢根据我想要的回答。对不起,我回复晚了