2014-02-11 67 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

工作就像一個魅力。謝謝 –