Linq - 根据其他数据表列值过滤数据表

时间:2014-02-11 07:42:49

标签: .net vb.net linq datatable

我有两个数据表具有不同的数据流结构,但有一个公共列。我想获得第一个数据表的ROWS,它们不会出现在基于列id的第二个数据表上。我可以完成它。我尝试了几件事:

表:DatasetGlobal和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)

1 个答案:

答案 0 :(得分:1)

过滤DataTable的最简单方法是使用RowFilter属性。

示例:

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现在看起来像:

enter image description here