2012-02-23 69 views
2

我有一個數據集(以下稱爲dataSet),其中包含一個表和一些記錄。其中一列稱爲消息幷包含錯誤消息。如果有任何記錄在此字段中有值,我想將其複製到一個錯誤數據集(errorDataSet下面)中,然後將其從原始數據集中刪除。我設法與LINQ遠得到這樣的:如何使用LINQ從數據集中刪除記錄

 DataSet errorDataSet = dataSet.Copy(); 

     //find all records that have a Message column value 
     var query = from row in errorDataSet.Tables[0].AsEnumerable() 
        where !String.IsNullOrEmpty(row.Field<string>("Message")) 
        select row; 

     DataSet tempErrorDataSet = errorDataSet.Clone(); 
     foreach (var row in query) 
     { 
      tempErrorDataSet.Tables[0].Clear(); 
      tempErrorDataSet.Tables[0].ImportRow(row); 
      utility.WriteError(connectorName, row["Message"].ToString(), tempErrorDataSet); 

      //remove the error row from the good data 
      dataSet.Tables[0].Rows.Remove(row); 
     } 

底線拋出一個異常,或者我得到關於修改的集合等。我敢肯定有在LINQ這樣做的一個簡單的方法錯誤。

注意:我有tempErrorDataSet的原因是我將它轉換爲XML並將其傳遞到一個存儲過程 - 它只以一種格式記錄一次,因此我每次都清除它。

+0

什麼是你得到的錯誤,異常等? – gideon 2012-02-23 04:56:10

+0

關於從集合中刪除項目的例外情況,但是我想用LINQ完全重寫這段代碼,按照我的問題(這不是例外) – Rodney 2012-02-23 20:48:37

回答

3

您的查詢正在通過表中的行進行枚舉(間接)。正如你應該已經知道的那樣,當你列舉它時,你不能修改一個集合(在這種情況下刪除一些東西)。事先將內容放入列表中。這樣你就不是枚舉實際的表格,而是一些行的副本。

var query = (from row in errorDataSet.Tables[0].AsEnumerable() 
      where !String.IsNullOrEmpty(row.Field<string>("Message")) 
      select row).ToList(); 
+0

ps,我相信你想清除臨時表_before_循環,而不是在它之內。 – 2012-02-23 05:15:06

相關問題