0

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

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

即 FieldA1、FieldB1、FieldA2、FieldB2

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

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

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

由于非常严格的数据库访问策略,我无法添加视图或存储过程来检索为单个列表。

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

4

2 回答 2

1

我可能在这里遗漏了一些东西,但是您不能使用 Merge 合并两个 DataTables吗?

DataTableA.Merge(DataTableB)

然后你可以使用DataTableA.AsEnumerable()

然后查看有关如何删除重复项的答案或

您可以DataView按如下方式执行此操作:dt.DefaultView.ToTable(True,[Column names])

于 2012-07-04T10:50:41.027 回答
0

这是我想出的解决方案。

使用.Merge(感谢马特的回答)结合 2 个数据表

以此为基础,我想出了以下代码,以根据 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
于 2012-07-04T16:31:20.177 回答