Как удалить записи из набора данных с помощью LINQ - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть набор данных (называемый ниже dataSet) с одной таблицей и несколькими записями в ней. Один из столбцов называется «Сообщение» и содержит сообщение об ошибке. Если какие-либо записи имеют значение в этом поле, я хочу скопировать его в набор данных об ошибках (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 Ответ

3 голосов
/ 23 февраля 2012

Ваш запрос перечисляет (косвенно) по строкам таблицы. Как вы уже должны знать, вы не можете изменить коллекцию (удалить что-то в этом случае), так как перечислите ее. Бросьте содержимое в список заранее. Таким образом, вы перебираете не реальную таблицу, а копию некоторых строк.

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