如何使用LINQ从数据集中删除记录

时间:2012-02-23 04:49:48

标签: linq dataset

我有一个数据集(下面称为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并将其传递给存储过程 - 它只采用该格式的一次记录,因此我每次都清除它。

1 个答案:

答案 0 :(得分:3)

您的查询是通过表中的行枚举(间接)。正如您应该已经知道的那样,在枚举它时,您无法修改集合(在这种情况下删除某些内容)。事先将内容放入列表中。这样你就不会通过实际的表来枚举,而是复制一些行。

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