2012-07-04 6 views
0

Я имею дело с устаревшим приложением, которое написано на VB.Net 2.0 в отношении базы данных SQL 2000.VB.Net - эффективный способ дедупликации данных

Существует одна таблица, имеющая ~ 125 000 строк и 2 пары полей со схожими данными.

т.е. FieldA1, FieldB1, FieldA2, FieldB2

мне нужно обрабатывать комбинированный, отличный список FieldA, FieldB.

Использование SQL Я подтвердил, что существует ~ 140 000 различных строк.

Из-за очень ограничительной структуры в приложении я могу получить данные только как два объекта XML, 2 объекта DataTable или 2 объекта DataTableReader. Я не могу выполнить собственный SQL, используя фреймворк.

Из-за очень ограничительной политики доступа к БД я не могу добавить View или Stored Proc для извлечения в виде единого списка.

Каков наиболее эффективный способ объединить объекты XML/DataTable/DataTableReader в один, отдельный, IEnumerable объект для последующей обработки?

ответ

1

Возможно, я что-то пропустил, но разве вы не могли бы объединить оба DataTables using Merge?

DataTableA.Merge(DataTableB) 

Вы можете использовать DataTableA.AsEnumerable()

Тогда см this answer о том, как удалить дубликаты или

Вы можете сделать это с помощью DataView следующим образом: dt.DefaultView.ToTable(True,[Column names])

+0

Это объединяет 2, но есть дубликаты. – Shevek

+0

Метод DataView отлично работает с 5000 записями на нашем DEV db, но занимает очень много времени для обработки на нашем TST-db с 140 000 записей – Shevek

0

Это решение, которое я пришел с.

Объедините 2 DataTables с помощью .Merge (благодаря ответу Мэтта)

Использование this в качестве основы я придумал следующий код, чтобы получить определенные строки из DataTable на основе 2-х колонок:

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