C#比较2个DataTables将更改填充到第三个DataTable中

时间:2013-09-20 10:28:05

标签: c# datatable

好吧,假设我从一开始就有2个数据表。

第一个(源)包含来自da数据库的数据。 第二个还包含来自数据库的数据,这些值必须更新到第一个数据库中。

不幸的是他们没有相同的结构。 sourcedatatable有一些额外的列,第二列没有。

例如:

First DT: ID | Name | Company | Age
Second DT: Name | Company | Age

我希望使用第二个DataTable中的值来更新FIRST DataTable,如果存在一些差异(只有差异)。

关于如何解决这个问题的任何想法?关于性能的任何建议,即使使用非常大的数据库?

2 个答案:

答案 0 :(得分:0)

如果您正在处理大量数据,我建议尽可能靠近数据库(如果可能,在存储过程中)。

如果坚持使用.NET是强制性的,那么考虑到您提供的场景描述,我会考虑这些选项。

首先,我会选择如何加载数据(我会考虑它们的顺序):

  1. 生成实体(LINQ to SQL)。
  2. 使用F#类型提供程序
  3. 直接使用ADO
  4. 在此之后,我会:

    1. 使用。选择和。除了IQueryable来源,或
    2. 做一些与http://canlu.blogspot.ro/2009/05/how-to-compare-two-datatables-in-adonet.html类似的事情,如果我有机会使用ADO.NET
    3. 如果您不提供有关数据类型,数量,硬件,数据库类型的更多信息,则很难给出具体而准确的答案。

      注意:无论您选择哪种解决方案,都应该记住,很难比较不同结构的内容,因此需要额外添加空列到缺少列的步骤。

答案 1 :(得分:0)

此代码仅供参考,我没时间测试它。它可能需要进行一些调整。尝试类似:

var a = new DataTable();
a.Columns.Add("ID");
a.Columns.Add("Name");
a.Columns.Add("Company");
a.Columns.Add("Age");

var b = new DataTable();
b.Columns.Add("Name");
b.Columns.Add("Company");
b.Columns.Add("Age");

var destination = a.AsEnumerable();
var localValues = b.AsEnumerable();


var diff = destination.Join(localValues, dstRow => dstRow["Name"], srcRow => srcRow["Name"],
    (dstRow, srcRow) => 
new {Destination = dstRow, Source = srcRow})
.Where(combinedView =>
    combinedView.Destination["Age"] != combinedView.Source["Age"] ||
    combinedView.Destination["Company"] != combinedView.Source["Company"]);

另外,我真的会转向一个合适的数据库,并且可能会改进数据模型。