VB.Net - 重复数据删除的有效方法

时间:2012-07-04 10:44:47

标签: vb.net .net-2.0 ienumerable deduplication

我正在处理一个用VB.Net 2.0编写的遗留应用程序,而不是SQL 2000数据库。

有一个表有大约125,000行和2对具有相似数据的字段。

即。 FieldA1,FieldB1,FieldA2,FieldB2

我需要处理一个组合的,不同的FieldA,FieldB列表。

使用SQL我已经确认有大约140,000个不同的行。

由于应用程序中的限制性框架,我只能将数据检索为2个XML对象,2个DataTable对象或2个DataTableReader对象。我无法使用框架执行自定义SQL。

由于数据库访问策略非常严格,我无法添加View或Stored Proc作为单个列表进行检索。

将2个XML / DataTable / DataTableReader对象组合成单个不同的IEnumerable对象以供以后处理的最有效方法是什么?

2 个答案:

答案 0 :(得分:1)

我可能在这里遗漏了一些内容,但你不能将两个DataTables using Merge结合起来吗?

DataTableA.Merge(DataTableB)

然后,您可以使用DataTableA.AsEnumerable()

然后请参阅this answer了解如何删除重复项或

您可以使用DataView执行此操作,如下所示:dt.DefaultView.ToTable(True,[Column names])

答案 1 :(得分:0)

这是我提出的解决方案。

使用.Merge合并2个DataTables(感谢Matt的回答)

使用this作为基础我想出了以下代码,以便根据2列从DataTable中获取不同的行:

Private Shared Function GetDistinctRows(sourceTable As DataTable, ParamArray columnNames As String()) As DataTable

    Dim dt As New DataTable
    Dim sort = String.Empty

    For Each columnName As String In columnNames

        dt.Columns.Add(columnName, sourceTable.Columns(columnName).DataType)

        If sort.Length > 0 Then
            sort = sort & ","
        End If

        sort = sort & columnName

    Next

    Dim lastValue As DataRow = Nothing

    For Each dr As DataRow In sourceTable.Select("", sort)

        Dim add As Boolean = False

        If IsNothing(lastValue) Then
            add = True
        Else
            For Each columnName As String In columnNames
                If Not (lastValue(columnName).Equals(dr(columnName))) Then
                    add = True
                    Exit For
                End If
            Next
        End If

        If add Then
            lastValue = dr
            dt.ImportRow(dr)
        End If

    Next

    Return dt

End Function