枚举DataTable,过滤项目,然后恢复为DataTable

时间:2012-02-27 16:00:59

标签: c# linq ado.net datatable ienumerable

我想通过将列值转换为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 个答案:

答案 0 :(得分:1)

假设您要过滤就地行,那么过滤后的行应该在中通过相同的 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是用于DataSetupdate the database的一部分,则对DataTable.Rows集合所做的所有修改都将反映在相应的数据库中更新期间的表格。

答案 1 :(得分:1)

我会创建一个数据表的空克隆:

DataTable newTable = dt.Clone();

然后从旧表中导入与过滤器匹配的行:

foreach(DataRow row in ie)
{
    newTable.ImportRow(row);
}