2013-07-02 37 views
2

這裏我有兩個數據表dtPartMaster([零件編號導出])和dtPartBackUp([零件編號備份],[重量]) 現在我想刪除dtPartBackUp其中[份數備份]不dtPartMaster存在([型號導出]) 我的邏輯是這樣的,但它需要很長時間來處理陀飛輪記錄快速從數據表中刪除行不在其他數據表中找到

button1_click() 
    { int count = 0; 
//line remove for clearity 

    foreach (DataRow dr in dtPartBackUp.Rows) 
    { 
     if (!CheckPartNumber(dr["Part Number Backup"].ToString(), dtPartMaster)) 
     { 
      dtPartBackUp.Rows[count].Delete(); 
     } 

    count++; 
    } 

    dtPartBackUp.AcceptChanges();// to accept changes 

    } 

private bool CheckPartNumber(string PartNumber, DataTable dt) 
     { 
      bool flag = false; 
      DataRow dr = dt.Select("[Part Number Exported] Like '" + PartNumber + "'").FirstOrDefault(); 
      if (dr != null) 
       flag = true; 

      dr = null; 
      return flag; 

     } 

在此先感謝 阿姆裏特

+0

'返回0行',哪個方法返回0行? –

+0

CompareTwoDataTable()的返回數據表中有0行 – user547534

+0

和第一種方法「檢查()的工作正常,但你爲何用「喜歡」的檢查方法花費時間過長 – user547534

回答

0

試試這個(未經測試),

這應返回你行的這些名單都在DT1及DT2 id列的基礎上,(我正在考慮您的ID和ID2列的類型是字符串)

var rows = (from r1 in dt1.AsEnumerable() 
      join r2 in dt2.AsEnumerable() on r1.Field<string>("id") equals r2.Field<string>("id2") 
      select r1).ToList(); 
+0

爬完,你的代碼工作,但不是唯一的correct.return幾排 – user547534

+0

爬完您好,請再次檢查我的代碼張貼清楚你明白我想說什麼謝謝 – user547534

0
for (i = 0;i< dtPartBackUp.Rows.count;i++) 
    { 
     if (!CheckPartNumber(dr["Part Number Backup"].ToString(), dtPartMaster)) 
     { 
      dtPartBackUp.Rows.removeat(i); 
i--; 
     } 


    } 

    dtPartBackUp.AcceptChanges();// to accept changes 

    } 

private bool CheckPartNumber(string PartNumber, DataTable dt) 
     { 
      bool flag = false; 
      DataRow dr = dt.Select("[Part Number Exported] Like '" + PartNumber + "'").FirstOrDefault(); 
      if (dr != null) 
       flag = true; 

      dr = null; 
      return flag; 

     }