使用不同的模式在两个类型化的DataTable中获取不同的行

时间:2011-07-15 23:01:12

标签: .net linq linq-to-dataset

如何从TableA中获取不在TableB中的所有行,其中TableA的模式与TableB不同(它们是来自不同dbms的不同类型的DataTable类)?

enter image description here enter image description here

我需要所有country - country_id不在Country的行idCountry

这不起作用,因为它们具有不同的架构(src.countrydest.Country是不同的DataTable类):

Dim srcNotInDest = src.country.Except(dest.Country)

srcdest是强类型数据集

注意:必然 VB.NET

我认为我需要提供IEqualityComparer作为第二个参数,但不知道如何。也许还有另一种(更快)的方法来识别新行。

背景

我正在将表从MySQL数据库导入到SQL-Server数据库中。仅检查主键并且不比较行的内容就足够了。虽然此示例表仅包含少量行但两个表包含~100000行,因此性能在同步源和目标时很重要。

1 个答案:

答案 0 :(得分:1)

如果它们是不同的数据库,我认为您需要单独检索ID并在内存中进行比较,例如(在C#语法中)

    var t1 = (from r in src.country  select r.country_id).ToList();
    var t2 = (from r in dest.Country select r.idCountry).ToList();

    var missing = t1.Except(t2);
  

性能在同步源

方面很重要

如果这是一次性迁移过程,那么即使这个例程需要几秒钟才可以接受。但你提到'同步',所以我认为这不是一次性的,所以这是否可以接受取决于它的运行频率。

快速测试我的机器在一个表中读取200,000,在另一个表中读取100000(确实在同一个sql数据库中)并比较它们需要0.4秒。当然,还有其他因素需要考虑,例如sql server上的负载等。