2012-02-23 71 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

相关问题