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 を実行できません。

DB アクセス ポリシーが非常に制限されているため、View または Stored Proc を追加して単一のリストとして取得することができません。

後で処理するために、2 つの XML / DataTable / DataTableReader オブジェクトを 1 つの個別の IEnumerable オブジェクトに結合する最も効率的な方法は何ですか?

4

2 に答える 2

1

ここで何かを見逃したかもしれませんが、 Mergeを使用して両方のDataTableを組み合わせることができませんでしたか?

DataTableA.Merge(DataTableB)

その後、使用することができますDataTableA.AsEnumerable()

次に、重複を削除する方法についてこの回答を参照してください。

次のようにこれを行うことができDataViewます:dt.DefaultView.ToTable(True,[Column names])

于 2012-07-04T10:50:41.027 に答える
0

これが私が思いついた解決策です。

を使用して2つのDataTableを結合します.Merge(Mattの回答に感謝します)

これをベースとして使用して、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 に答える