【问题标题】:Difference Between 2 DataTable2个数据表之间的区别
【发布时间】:2011-09-26 20:10:03
【问题描述】:

我有 2 个 DataTable,我想创建第三个 DataTable,其中包含 DataTable 1 和 DataTable 2 之间的差异。

例如,DataTable1 有原始数据,DataTable 2 只是一个副本,就像复制一样。但是当您在 DataTable1 中插入新行时,DataTable2 只是插入了同一行。现在我的代码在 DataTable1 和 DataTable2 之间进行比较,如果不等于(插入了 1 行或更多行),DataTable2 再次记录 DataTable1 中的所有数据。

我怎样才能做一个选择命令,做这个区别并将这些数据记录在第三个 DataTable 中?

【问题讨论】:

  • 您无法使用代码对DataTables 执行大量查询。例如,您不能简单地写SELECT * FROM TABLE;。但是,您可以使用 LINQ 编写伪查询。
  • 那么,我该如何做一个比较 2 个 DataTable 的 LINQ?
  • 这个可以帮到你。 stackoverflow.com/questions/164144/…

标签: c# asp.net linq select datatable


【解决方案1】:

试试这样的:

table1.Merge(table2); 
DataTable changesTable = table1.GetChanges(); 

【讨论】:

  • 第三个DataTable,用GetChanges方法返回Null。
  • 不,我认为 changesTable 将填充 Table1 合并后的所有记录。
  • 重复项将被丢弃,只有table1table2 之间的差异将填充到changesTable
  • @JamesJohnson 我已经对其进行了测试,但它使用 Table1 中的所有记录填充了changesTable。我认为 linq 是解决这个问题的唯一方法。
  • 这没有意义。如果有的话,它应该使用 table2 中的记录填充 changesTable。
【解决方案2】:

我会考虑有两列来标识表(col1,col2)

var rowsOnlyInDt1 = dt1.AsEnumerable().Where(r => !dt2.AsEnumerable()
                    .Any(r2 => r["col1"].Trim().ToLower() == r2["col1"].Trim().ToLower() && r["col2"].Trim().ToLower() == r2["col2"].Trim().ToLower()));

DataTable result = rowsOnlyInDt1.CopyToDataTable();//The third table

【讨论】:

    【解决方案3】:

    仅使用 SQL 您可以使用UNION 轻松找到差异,这里有一篇关于该主题的优秀文章:http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx

    当表匹配时,查询将返回一个空行集,否则返回不同的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多