如何比较两个数据表并仅检查找到的行
本文关键字:查找 检查 两个 何比较 比较 数据表 | 更新日期: 2023-09-27 18:28:34
var qry = from r1 in dtCMS.AsEnumerable() //row count - 416
from r2 in dtEcho.AsEnumerable() //row count - 175
where
r1.Field<string>("Name") == r2.Field<string>("Name")
select r2;
DataTable dt1 = dtEcho.AsEnumerable().Except(qry).CopyToDataTable();
错误:
源不包含任何数据行。
如何修改上面的代码,以便仅对r2
中的行进行比较?
我想要两个功能:
- 一个,将
dtEcho
与dtCMS
进行比较,并返回任何内容dtEcho
但不在dtCMS
. - 二,将
dtEcho
与dtCMS
进行比较,并返回任何内容dtCMS
但不在dtEcho
.
如果我正在比较的数据表具有更多行,则代码将失败,因此无法比较。
如果源序列不包含任何DataRow
对象,CopyToDataTable
将抛出InvalidOperationException
:
源不包含任何数据行。
您的代码通常没问题,并且要以最少的更改解决问题,您唯一应该更改的是创建结果的方式。
而不是使用 CopyToDataTable
使用 for 循环将结果放入结果表中。为此,首先应创建第二个表的克隆。
var qry = from r1 in table1.AsEnumerable() //row count - 416
from r2 in table2.AsEnumerable() //row count - 175
where
r1.Field<string>("Name") == r2.Field<string>("Name")
select r2;
var dt = table2.Clone();
table2.AsEnumerable().Except(qry).ToList().ForEach(x =>
{
dt.Rows.Add(x);
});
this.dataGridView1.DataSource = dt;
如果我得到了你想要的,代码应该看起来像这样:
// setup
var dtCMS = new DataTable();
dtCMS.Columns.Add("ID", typeof(int));
dtCMS.Columns.Add("Name", typeof(String));
for (int i = 0; i < 416; i++)
dtCMS.Rows.Add(i, "Name " + i);
var dtEcho = new DataTable();
dtEcho.Columns.Add("ID", typeof(int));
dtEcho.Columns.Add("Name", typeof(String));
for (int i = 400; i < 575; i++)
dtEcho.Rows.Add(i, "Name " + i);
// convert to enumerables
var cmsEnum = dtCMS.AsEnumerable();
var echoEnum = dtEcho.AsEnumerable();
var CmsMinusEcho = cmsEnum.Where(cms => !echoEnum.Any(echo => echo.Field<String>("Name").Equals(cms.Field<String>("Name"))));
var EchoMinusCms = echoEnum.Where(echo => !cmsEnum.Any(cms => cms.Field<String>("Name").Equals(echo.Field<String>("Name"))));
// get DataTable with check
var CmsMinusEchoDt = CmsMinusEcho.Count() > 0 ? CmsMinusEcho.CopyToDataTable() : null;
var EchoMinusCmsDt = EchoMinusCms.Count() > 0 ? EchoMinusCms.CopyToDataTable() : null;