Reputation: 11063
I have two datatables with different datarow structure but one common column. I would like to get the ROWS of the first datatable, that are not present on the second datatable based on a column id. I can get it done. I have tried several things:
Tables: DatasetGlobal and DatasetInserted:
Dim queryw = From r In DatasetGlobal.Tables(0). _
AsEnumerable().ToList() _
.Where(Function(r)
Return DatasetInserted.Tables(0).AsEnumerable().ToList().Any _
(Function(r2)
Return Not r2.Field(Of Decimal)(Constants.IDINDICAD) = _
r.Field(Of Decimal)(Constants.cteIDINDICAD)
End Function)
End Function)
Upvotes: 0
Views: 2463
Reputation: 101052
The easiest way to filter a DataTable
is to use the RowFilter
property.
Example:
Dim dt1 = New DataTable()
dt1.Columns.Add("id", GetType(Integer))
dt1.Rows.Add(New Object() {1})
dt1.Rows.Add(New Object() {3})
dt1.Rows.Add(New Object() {5})
Dim dt2 = New DataTable()
dt2.Columns.Add("id", GetType(Integer))
dt2.Columns.Add("value", GetType(String))
dt2.Rows.Add(New Object() {1, "Foo"})
dt2.Rows.Add(New Object() {2, "Bar"})
dt2.Rows.Add(New Object() {3, "Foo"})
dt2.Rows.Add(New Object() {4, "Bar"})
dt2.Rows.Add(New Object() {5, "Foo"})
Dim ids = dt1.AsEnumerable().Select(Function(r) CInt(r(0)))
dt2.DefaultView.RowFilter = String.Format("id not in ({0})", String.Join(",", ids))
dt2.DefaultView
now looks like:
Upvotes: 1