我想通过将列值转换为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;
答案 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是用于DataSet的update the database的一部分,则对DataTable.Rows集合所做的所有修改都将反映在相应的数据库中更新期间的表格。
答案 1 :(得分:1)
我会创建一个数据表的空克隆:
DataTable newTable = dt.Clone();
然后从旧表中导入与过滤器匹配的行:
foreach(DataRow row in ie)
{
newTable.ImportRow(row);
}