对DataTable进行枚举,筛选项,然后恢复到DataTable

本文关键字:DataTable 然后 恢复 选项 筛选 枚举 | 更新日期: 2023-09-27 18:25:52

我想通过将列值转换为IEnumerable<DataRow>,根据字符串数组中是否包含列值来筛选DataTable中的项,然后我想将其重新转换为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;

对DataTable进行枚举,筛选项,然后恢复到DataTable

我将创建数据表的空克隆:

DataTable newTable = dt.Clone();

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

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

假设您想在中过滤行,也就是说,过滤的行应该在中返回通过原始数据库查询创建的相同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是用于更新数据库的数据集的一部分,则在更新期间,对DataTable.Rows集合所做的所有修改都将反映在相应的数据库表中。