Vb.net NET Linq筛选器表行

Vb.net NET Linq筛选器表行,vb.net,linq,Vb.net,Linq,我需要在vb.net中使用linq,但我并不真正关心它的点符号样式还是其他样式 我需要筛选一个如下所示的数据表 legacyparent1,name1,id1 legacyparent1,name2,id2 legacyparent1,name1,id1 legacyparent1,name2,id2 legacyparent1,name1,id1 legacyparent1,name2,id2 我只需要两行不同的名称和id 这是由我现在没有时间尝试重写的遗留连接造成的。不是最有效的,但这里有一

我需要在vb.net中使用linq,但我并不真正关心它的点符号样式还是其他样式

我需要筛选一个如下所示的数据表

legacyparent1,name1,id1

legacyparent1,name2,id2

legacyparent1,name1,id1

legacyparent1,name2,id2

legacyparent1,name1,id1

legacyparent1,name2,id2

我只需要两行不同的名称和id


这是由我现在没有时间尝试重写的遗留连接造成的。

不是最有效的,但这里有一条捷径:

Dim dataTable2 = dataTable1.DefaultView.ToTable(true)
或者使用哈希集更高效一些:

Dim dt2 = dataTable1.Rows.Cast(Of DataRow).Distinct(DataRowComparer.Default).CopyToDataTable

据我所知,有两种不同的口味。第一个和默认值可以找到不同的基元类型。例如,如果只需要唯一的名称,则可以运行类似以下内容的程序:items.SelectFunctionx x.Name.Distinct以仅获取名称。要在多个列上运行distinct,您必须使用IEqualityComparer来帮助它

由于没有可使用的结构,我创建了一个名为Item的类,该类与此处的数据相匹配。以下是生成的代码:

Public Class Item
    Public Property Parent As String
    Public Property Name As String
    Public Property ID As String
End Class
比较器可以是任何东西。我见过人们使用类本身,以代码运行的形式,或者像我在这里所做的那样使用专用类

Public Class CompareThings
    Implements IEqualityComparer(Of Item)

    Public Overloads Function Equals(x As Item, y As Item) As Boolean Implements IEqualityComparer(Of Item).Equals
        Return x.ID = y.ID AndAlso x.Name = y.Name
    End Function

    Public Overloads Function GetHashCode(obj As Item) As Integer Implements IEqualityComparer(Of Item).GetHashCode
        Return (obj.Name & obj.ID).GetHashCode()
    End Function
End Class
最后,要查看此操作,请运行以下命令

Dim things = New List(Of Item)(
{
    New Item With {.Parent = "legacyparent1", .Name = "name1", .ID = "id1"},
    New Item With {.Parent = "legacyparent1", .Name = "name2", .ID = "id2"},
    New Item With {.Parent = "legacyparent1", .Name = "name2", .ID = "id2"},
    New Item With {.Parent = "legacyparent1", .Name = "name1", .ID = "id1"},
    New Item With {.Parent = "legacyparent1", .Name = "name1", .ID = "id1"}
})

Dim cmp As New CompareThings()

Dim results = things.Distinct(cmp)

For Each res In results
    ' Console.WriteLine($"ID: {res.ID}, Name: {res.Name}")
    ' In case you are running an older version of .NET that doesn't have the above feature
    Console.WriteLine("ID: {0}, Name: {1}", res.ID, res.Name)
Next

这应该只提供您想要的两条记录。

我没有提供连接,因为在这种情况下,我试图通过linq修复结果,而不是修复sql查询本身。如果我这样做的话,我可能还需要多次访问数据库。通常,我可以通过sql第一次得到我需要的东西,但在这种情况下,我必须使用linq,我对它不是特别熟悉。