我正在处理一个用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对象以供以后处理的最有效方法是什么?
答案 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