Перечислять через DataTable, фильтровать элементы, затем возвращаться к DataTable - PullRequest
3 голосов
/ 27 февраля 2012

Я хотел бы отфильтровать элементы в моем DataTable по тому, содержится ли значение столбца внутри строкового массива путем преобразования его в IEnumerable<DataRow>, после чего я бы хотел преобразовать его в DataTable, посколькувот что должен вернуть мой метод.

Вот мой код:

string[] ids = /*Gets string array of IDs here*/
DataTable dt = /*Databasecall returning a DataTable here*/
IEnumerable<DataRow> ie = dt.AsEnumerable();
ie = ie.Where<DataRow>(row => ids.Contains(row["id"].ToString()));
/*At this point I've filtered out the entries I don't want, now how do I convert this back to a DataTable? The following does NOT work.*/
ie.CopyToDataTable(dt, System.Data.LoadOption.PreserveChanges);
return dt;

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Я бы создал пустой клон таблицы данных:

DataTable newTable = dt.Clone();

Затем импортируйте строки из старой таблицы, которые соответствуют фильтру:

foreach(DataRow row in ie)
{
    newTable.ImportRow(row);
}
1 голос
/ 27 февраля 2012

Если вы хотите отфильтровать строки на месте , то есть отфильтрованные строки должны быть возвращены в в том же DataTable , который был создан с помощью Исходный запрос к базе данных, вы должны сначала очистить коллекцию DataTable.Rows . Затем вы должны скопировать отфильтрованные строки в массив и последовательно добавить их:

ie = ie.Where<DataRow>(row => ids.Contains(row["id"].ToString())).ToArray();
dt.Rows.Clear();

foreach (var row in ie)
{
    dt.Rows.Add(row);
}

Альтернативным способом достижения этой цели может быть простое повторение строк в DataTable один раз и удаление тех, которые должны быть отфильтрованы:

foreach (var row in dt.Rows)
{
    if (ids.Contains(row["id"].ToString()) == false)
    {
        row.Delete();
    }
}

dt.AcceptChanges();

Обратите внимание, что если DataTable является частью DataSet , который используется для обновления базы данных , все изменения вносятся в DataTable. Строка collection будет отражена в соответствующей таблице базы данных во время обновления.

...