过滤数据表并将结果复制到两个不同的数据表
Posted
技术标签:
【中文标题】过滤数据表并将结果复制到两个不同的数据表【英文标题】:Filtering DataTable and copying results to two different DataTables 【发布时间】:2016-08-16 09:18:44 【问题描述】:我正在尝试通过某个列值(DateTime 类型)过滤返回 DataTable 的方法的结果,并将它们插入到两个不同的 DataTable 中,如下所示:
var vAllItems = myClass.GetAllResults(x,y,z);
DataTable dtExpiredItems = new DataTable();
DataTable dtActiveItems = new DataTable();
var expiredItems = vAllItems.AsEnumerable().Where(r => r.Field<DateTime?>("ExpDate") <= DateTime.Now && r.Field<DateTime?>("ExpDate").HasValue);
var activeItems = vAllItems.AsEnumerable().Where(r => r.Field<DateTime?>("ExpDate") > DateTime.Now || !r.Field<DateTime?>("ExpDate").HasValue);
foreach(DataRow row in expiredItems)
dtExpiredItems.Rows.Add(row);
foreach (DataRow row in activeItems)
dtActiveItems.Rows.Add(row);
rptExpiredItems.DataSource = dtExpiredItems;
rptExpiredItems.Bind();
pchExpiredItems.Visible = dtExpiredItems.Rows.Count > 0;
rptActiveItems.DataSource = dtActivetItems;
rptActiveItems.Bind();
pchActiveItems.Visible = dtActiveItems.Rows.Count > 0;
问题是,在第二个 foreach 循环中出现以下错误:
This row already belongs to another table.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: This row already belongs to another table.
感谢任何帮助!谢谢!
【问题讨论】:
DateTime.Now() 不断变化。您想在查询之前将其设置为变量。理论上 expireditems 和 activeitems 不应具有来自 vAllItems 的相同行(除非 DataTime 为空)。所以我认为这个问题的发生是因为 null DataTime。 【参考方案1】:一个DataRow 只能属于一个DataTable
,您应该从给定的行值创建一个新行。
使用DataRow
的ItemArray
属性获取值并将object[]
作为输入传递以创建新行。
dtExpiredItems.Rows.Add(row.ItemArray);
或使用ImportRow
dtExpiredItems.ImportRow(row);
另一种选择是使用CopyToDataTable
(DataTable) 扩展从Linq
输出创建新表,然后使用新表进行绑定。
dtExpiredItems = expiredItems.CopyToDataTable<DataRow>();
【讨论】:
谢谢 Hari,标记为正确。虽然在调用 CopToDataTable 方法之前需要验证项目计数!【参考方案2】:您在哪里进行以下操作
dtExpiredItems.Rows.Add(row);
dtActiveItems.Rows.Add(row);
你可以这样做
dtExpiredItems.ImportRow(row);
dtActiveItems.ImportRow(row);
【讨论】:
以上是关于过滤数据表并将结果复制到两个不同的数据表的主要内容,如果未能解决你的问题,请参考以下文章