Member 13863260 Ответов: 1

Поиск пропущенных значений в двух датаблях


Привет
У меня есть две таблицы данных CurrentPayrollTable и PreviousPayrollTable Мне нужно сравнить эти две таблицы, чтобы узнать номер сотрудника, который выходит в CurrentPayrollTable таблица, но не существует в PreviousPayrollTable и номер сотрудника, который существует в PreviousPayrollTable но не в CurrentPayrollTable. Я попытался использовать приведенный ниже запрос, но получил ошибку.


Любая помощь/указатель в этом вопросе будут высоко оценены.

Спасибо
Гаурав

Что я уже пробовал:

(From rowSheet1 In CurrentPayrollTable.AsEnumerable()
                    Where    (From rowSheet2 In PreviousPayrollTable.AsEnumerable()
                              Where !CInt(rowSheet1("Employee Number").ToString).Contains(CInt(rowSheet2("Employee Number").ToString))
                              Select rowSheet2).Count>0
Select rowSheet1).UNION(
(From rowSheet2 In PreviousPayrollTable.AsEnumerable()
Where    (From rowSheet1 In CurrentPayrollTable.AsEnumerable()
Where  	!CInt(rowSheet1("Employee Number").ToString).Contains(CInt(rowSheet2("Employee Number").ToString))                             						   
                               Select rowSheet1).Count>0
                    Select rowSheet2)).CopyToDatatable()

1 Ответов

Рейтинг:
0

Richard Deeming

Попробуйте что-нибудь вроде этого:

Dim currentEmployees As IEnumerable(Of Integer) = CurrentPayrollTable.AsEnumerable().Select(Function (row) row.Field(Of Integer)("Employee Number"))
Dim previousEmployees As IEnumerable(Of Integer) = PreviousPayrollTable.AsEnumerable().Select(Function (row) row.Field(Of Integer)("Employee Number"))

Dim currentEmployeesNotInPrevious As IEnumerable(Of Integer) = currentEmployees.Except(previousEmployees)
Dim previousEmployeesNotInCurrent As IEnumerable(Of Integer) = previousEmployees.Except(currentEmployees)

' To get the employees who are not in both tables:
Dim employeesMissing As New HashSet(Of Integer)(currentEmployees)
employeesMissing.SymmetricExceptWith(previousEmployees)
' employeesMissing now contains employees who are in one table but not the other.


Member 13863260

Большое вам спасибо за быстрое обновление, но как я могу получить результат в формате datatable ?

Еще Раз Спасибо!
Гаурав

Richard Deeming

Для всех сотрудников в одном столе, но не для другого?

Dim currentRows As IEnumerable(Of DataRow) = CurrentPayrollTable.AsEnumerable().Where(Function (row) employeesMissing.Contains(row.Field(Of Integer)("Employee Number")))
Dim previousRows As IEnumerable(Of DataRow) = PreviousPayrollTable.AsEnumerable().Where(Function (row) employeesMissing.Contains(row.Field(Of Integer)("Employee Number")))

Dim result As DataTable = currentRows.Union(previousRows).CopyToDataTable()

Member 13863260

Еще раз большое вам спасибо, но когда я использую ниже, я получаю employeesMissing no defined error.

Dim currentrow As IEnumerable(Of DataRow) = CurrentPayrollTable.Методом asenumerable().Где(функция (строка) employeesMissing.Содержит(row.Field(Of Integer)("номер сотрудника")))
Dim previousRows As IEnumerable(Of DataRow) = PreviousPayrollTable.Методом asenumerable().Где(функция (строка) employeesMissing.Содержит(row.Field(Of Integer)("номер сотрудника")))

Тусклый результат как DataTable = currentrow.Союз(предыдущее соглашение).CopyToDataTable()

Кроме того, я попытался использовать приведенный ниже запрос, он работает нормально, но он не сравнивает на основе номера сотрудника только так, что его тянет номер сотрудника, который присутствует в обоих файлах, но с разницей в другом столбце( каждая таблица имеет номер сотрудника и столбец суммы, так что я хочу только, если номер сотрудника не присутствует вообще, и он не должен тянуть, если номер сотрудника присутствует с diff amoutn в обеих таблицах).

(Из таблицы строк 1 в CurrentPayrollTable.Выбрать
Выберите rowSheet1).Кроме(
(Из таблицы строк 2 в PreviousPayrollTable.Select() Select rowSheet2)).Copytodatable()


Огромное спасибо
Гаурав

Richard Deeming

Dim currentEmployees As IEnumerable(Of Integer) = CurrentPayrollTable.AsEnumerable().Select(Function (row) row.Field(Of Integer)("Employee Number"))
Dim previousEmployees As IEnumerable(Of Integer) = PreviousPayrollTable.AsEnumerable().Select(Function (row) row.Field(Of Integer)("Employee Number"))

Dim employeesMissing As New HashSet(Of Integer)(currentEmployees)
employeesMissing.SymmetricExceptWith(previousEmployees)

Dim currentRows As IEnumerable(Of DataRow) = CurrentPayrollTable.AsEnumerable().Where(Function (row) employeesMissing.Contains(row.Field(Of Integer)("Employee Number")))
Dim previousRows As IEnumerable(Of DataRow) = PreviousPayrollTable.AsEnumerable().Where(Function (row) employeesMissing.Contains(row.Field(Of Integer)("Employee Number")))

Dim result As DataTable = currentRows.Union(previousRows).CopyToDataTable()