2012-11-13 62 views
0

我的數據表1(dtOutput)格式(termid,faultid,faultdesc,faulttime,devicetype)從兩個數據表進行比較返回的數據表/列值

我的數據表2(dtOpenEvent)格式(termid,faultid)

我想要檢索那些存在於數據表2的值,但不在數據表1 ...基於兩列(termid,faultid)沒有表具有主鍵。

我搜索的淨並找到其返回兩個數據表之間的差異代碼...

現在我怎樣才能從中檢索列的值?無論是在其他的數據表或字符串變量

代碼: -

DataTable dtOpenEvent; 
dtOpenEvent = Generix.getOpenEvents(ref Connection); 
DataTable dtOutput; 
dtOutput = Generix.getFeedData(ref Connection); 
var matched = from table1 in dtOpenEvent.AsEnumerable() 
       join table2 in dtOutput.AsEnumerable() on table1.Field<string>("ATM") equals table2.Field<string>("termid") 
       where table1.Field<int>("Event") == table2.Field<int>("faultid") 
       select table1; 
var missing = from table1 in dtOpenEvent.AsEnumerable() 
       where !matched.Contains(table1) 
       select table1; 
+0

爲什麼你不嘗試最簡單的方法,如果你被卡住了。最簡單的方法是先在table2上創建兩個循環,然後將兩個字段與table1的每一行進行比較,如果找到相似的行,則繼續下一個table2的值。如果不與table1的任何一行直到最後一行相匹配,那麼將table1的這一行添加到第三個表 – Sami

+0

你可以幫我用代碼嗎? – Shaggy

+1

:)關閉當然。如果你得到幫助,我會很高興。 – Sami

回答

2

,你可以刪除所有在DT1列,然後做除外。

這樣的:
var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

完整的例子:

  DataTable dt1 = new DataTable(); 
      DataTable dt2 = new DataTable(); 

      dt1.Columns.Add("termid", typeof(Int32)); 
      dt1.Columns.Add("faultid", typeof(Int32)); 
      dt1.Columns.Add("faultdesc"); 
      dt2.Columns.Add("termid", typeof(Int32)); 
      dt2.Columns.Add("faultid", typeof(Int32)); 

      dt1.Rows.Add(1,2,"desc"); 
      dt1.Rows.Add(3, 4, "desc"); 
      dt1.Rows.Add(5, 6, "desc"); 
      dt2.Rows.Add(1, 2); 
      dt2.Rows.Add(3, 4); 
      dt2.Rows.Add(7, 8); 

      dt1.Columns.Remove("faultdesc"); 
      var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default); 

      foreach (var row in diff) 
      { 
       Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8 
      } 

或代替刪除列,你可以通過LINQ或數據視圖這樣選擇它們:

 var view = new DataView(dt1); 
     DataTable dt3 = view.ToTable(true, "termid", "faultid");  

修改示例:

  DataTable dt1 = new DataTable(); 
      DataTable dt2 = new DataTable(); 

      dt1.Columns.Add("termid", typeof(Int32)); 
      dt1.Columns.Add("faultid", typeof(Int32)); 
      dt1.Columns.Add("faultdesc"); 
      dt2.Columns.Add("termid", typeof(Int32)); 
      dt2.Columns.Add("faultid", typeof(Int32)); 

      dt1.Rows.Add(1,2,"desc"); 
      dt1.Rows.Add(3, 4, "desc"); 
      dt1.Rows.Add(5, 6, "desc"); 
      dt2.Rows.Add(1, 2); 
      dt2.Rows.Add(3, 4); 
      dt2.Rows.Add(7, 8); 

      var view = new DataView(dt1); 
      DataTable dt3 = view.ToTable(true, "termid", "faultid"); 
      var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default); 

      foreach (var row in diff) 
      { 
       Console.WriteLine(row["termid"] + " " + row["faultid"]); 
      } 
1
As you said : I want to retrieve those values which are present in Datatable 2 
but not in Datatable 1...based on two columns `(termid,faultid)` 

翻譯根據問題的背景下:你有兩個表dtOutputdtOpenEvent。您希望在第三個表中獲取dtOutput的值,以使第三個表的任何一行與dtOpenEvent的任意一行的前兩個單元格的值相同。那麼這裏是

DataTable dt3 = new DataTable(); 
dt3.Columns.Add("termid"); 
dt3.Columns.Add("faultid"); 
int nr = 0; 
for (int i = 0; i < dtOutput.Rows.Count; i++) 
{ 
    bool found = false; 
    for (int j = 0; j < dtOpenEvent.Rows.Count; j++) 
    { 
     if (dtOutput.Rows[i][0] == dtOpenEvent.Rows[j][0] 
      && dtOutput.Rows[i][1] == dtOpenEvent.Rows[j][1]) 
     { 
      found = true; 
      break; 
     } 
    } 
    if (!found) 
    { 
     dt3.Rows.Add(dt3.NewRow()); 
     dt3.Rows[nr][0] = dtOutput.Rows[i][0]; 
     dt3.Rows[nr][1] = dtOutput.Rows[i][1]; 
     nr++; 
    } 
}