2014-02-11 33 views
0

我有两个datatables具有不同的datarow结构,但一个共同的列。我想获得第一个数据表的ROWS,它不在基于列ID的第二个数据表中。我可以完成它。我已经试过几件事情:Linq - 基于其他数据列值过滤数据表

表: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) 
+0

什么是SPM206MTPs?另外,为了澄清,你是否想要不共享id值的行(第一个表)? – charlesw

+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

+0

工作就像一个魅力。谢谢 –