我有一个数据集(下面称为dataSet),其中包含一个表和一些记录。其中一列称为Message,包含错误消息。如果任何记录在此字段中有值,我想将其复制到错误数据集(下面的errorDataSet)中,然后将其从原始数据集中删除。我设法用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 :(得分:3)
您的查询是通过表中的行枚举(间接)。正如您应该已经知道的那样,在枚举它时,您无法修改集合(在这种情况下删除某些内容)。事先将内容放入列表中。这样你就不会通过实际的表来枚举,而是复制一些行。
var query = (from row in errorDataSet.Tables[0].AsEnumerable()
where !String.IsNullOrEmpty(row.Field<string>("Message"))
select row).ToList();