SQL选择与二进制搜索

SQL选择与二进制搜索,sql,vb.net,linq,search,Sql,Vb.net,Linq,Search,为了便于将来的问题,我添加了文档 将数据提取到datagridview,我知道代码远不是非常清晰,它只是为了理解这个主题的属性 CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts") CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData") Dim joined = From row1 In t.AsEnumerab

为了便于将来的问题,我添加了文档 将数据提取到datagridview,我知道代码远不是非常清晰,它只是为了理解这个主题的属性

    CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts")
    CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData")

    Dim joined = From row1 In t.AsEnumerable()
                   Join row2 In t2.AsEnumerable()
                   On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID")
                   Select BothRows = New With {row1, row2}






    With DataGridView1
        .Columns.Clear()
        .Rows.Clear()
        ' add columns of tblContacts table
        For i = 0 To joined.AsEnumerable.First.row1.Table.Columns.Count - 1
            .Columns.Add(joined.AsEnumerable.First.row1.Table.Columns(i).ColumnName.ToString, joined.AsEnumerable.First.row1.Table.Columns(i).ColumnName.ToString)
        Next
        ' add columns of ContactsData table
        For i = 0 To joined.AsEnumerable.First.row2.Table.Columns.Count - 1
            .Columns.Add(joined.AsEnumerable.First.row2.Table.Columns(i).ColumnName.ToString, joined.AsEnumerable.First.row2.Table.Columns(i).ColumnName.ToString)
        Next
        ' add rows to datagridview
        .Rows.Add((joined.Count - 1))

    End With

    Dim rownum As Integer = 0
    For Each x In joined

        Dim row1 As DataRow = x.row1
        Dim row2 As DataRow = x.row2

        ' populate data to dgv
        For i = 0 To row1.Table.Columns.Count - 1
            DataGridView1.Rows(rownum).Cells(i).Value = row1.Item(i).ToString
        Next

        For i = row1.Table.Columns.Count To DataGridView1.Columns.Count - 1
            DataGridView1.Rows(rownum).Cells(i).Value = row2.Item(i - row1.Table.Columns.Count).ToString
        Next

        rownum += 1
    Next
在测试@Tim的以下答案后: 我做了一个linq到数据集的测试,但我得到了一个错误,我不知道为什么。。 错误描述为“值不能为空”。参数名称:源' 以防万一,我已经测试了一个常规的SQL内部连接查询,它的工作状态良好

我在access中创建了两个表这是表

 tblCOntacts
 --------------
 ID FirstName   LastName
 ---------------------------------
 22 John        Smith
 23 Jane        Apple
 24 Jonathan    Tucker


 ContactsData
 --------------
 ID Proffesion  Hoby
 ---------------------------------
 22 Carpenter   Long Runs
 23 Pilot       Gym
 24 Psychologyst    Programming
这是我的代码,我对产生错误的行进行了注释:

 Private Sub Button4_Click(sender As System.Object, e As System.EventArgs)           Handles Button4.Click
     CreateDataTable(Me.t, "SELECT * FROM tblContacts", "tblContacts")
    CreateDataTable(Me.t2, "SELECT * FROM ContactsData", "ContactsData")

   Dim joined = From row1 In t.AsEnumerable()
                  Join row2 In t2.AsEnumerable()
                  On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID") ' here i get the error: Value cannot be null. Parameter name: source
                  Select BothRows = New With {row1, row2}

    For Each x In joined
        Dim row1 As DataRow = x.row1
        Dim row2 As DataRow = x.row2
    Next
 end sub


   Public con As OleDbConnection
   Public dset As DataSet
   Public ad As OleDbDataAdapter
   Public cmd As OleDbCommand
   Public t As DataTable
Public t2 As DataTable

  Private Sub CreateDataTable(ByVal tb As DataTable, ByVal query As String,   ByVal table As String)
         Dim q As String = query
    con = New OleDbConnection
    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Jonathan\Desktop\בסיס נתונים access\AddressBook.mdb"

    con.Open()
    dset = New DataSet
    cmd = New OleDbCommand(query, con)
    ad = New OleDbDataAdapter(cmd)
    ad.Fill(dset, table)
    con.Close()

    ' query dataset with linq
    tb = dset.Tables(table)
 end sub
我有两个来自不同Access数据库的数据表,因此我不能使用SQL连接语句,我需要通过相同的数字主键匹配来自这两个表的记录中的两列。 我正在考虑两种选择:

多个SQL选择查询。 使用visual basic对2个datatable对象进行二进制搜索。 什么方法更有效?更专业?正确的方法是什么


tanx

就效率以及更重要的可读性和可维护性而言,最好的方法是使用:


您需要添加Imports System.Linq。因为它使用了一个集合,所以效率很高。

好,现在是进入linq的时候了……谢谢@tim,我将使用该方法。在测试该建议后,我正在努力解决一些错误。。。描述在我的原始问题中被编辑。我将非常感谢您的帮助。@Jonathan:您不能以这种方式在CreateDataTable中初始化datatable,因为参数化程序不是ByRef,实际上您只是在初始化一个局部变量。我建议从方法中返回此表,因此将其设置为函数。当然,您也可以在这个方法中分配字段t和t1。tnx!最后一个问题是,如何从连接的变量中提取行数/列数?我没有找到任何属性,Joined只是包含匿名类型序列的变量的名称,该序列有两个属性row1和row2。因此,您可以使用类似于For Each的循环来枚举它们,如我上面所示。如果您想要收藏,可以使用Joined.ToList或ToArray。如果只需要计数,请使用Joined.count。
Dim joined = From row1 In table1.AsEnumerable()
             Join row2 In table2.AsEnumerable()
             On row1.Field(Of Int32)("ID") Equals row2.Field(Of Int32)("ID")
             Select BothRows = New With {row1, row2}

For Each x In joined
    Dim row1 As DataRow = x.row1
    Dim row2 As DataRow = x.row2
Next