如何比较两个数据表并仅检查找到的行

本文关键字:查找 检查 两个 何比较 比较 数据表 | 更新日期: 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中的行进行比较?

我想要两个功能:

  • 一个,将dtEchodtCMS进行比较,并返回任何内容 dtEcho但不在dtCMS.
  • 二,将dtEchodtCMS进行比较,并返回任何内容 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;