首页 > 解决方案 > 通过某些列比较相同的 DataTable,将不匹配返回给 CopyToDataTable()

问题描述

我有两个数据表(列:ID、MODEL、POWER、CLASS):

表格1:

411 Audi   500 300
412 BMW    400 800
413 Lexus  200 700

表 2:

876 Audi   500 300
896 BMW    400 870
832 Lexus  200 700
874 Fiat   250 450

结果我需要得到(至少一个标准不匹配,不考虑ID):

412 BMW    400 800
896 BMW    400 870

我无法执行Except,因为第一个数字在两个(4.. & 8..)之间不匹配。如果我在将两个数据表合并在一起之前进行查询:

var matched = from table1 in MainProcess.dt1.AsEnumerable()
     join table2 in MainProcess.dt2.AsEnumerable()
     on table1.Field<string>("MODEL") equals table2.Field<string>("MODEL")

     where table1.Field<string>("POWER") != table2.Field<string>("POWER")
     || table1.Field<string>("CLASS") != table2.Field<string>("CLASS")
                 select table1;

     return matched.CopyToDataTable();

结果我只得到一个结果412 BMW 400 800。我试过了,.Count() > 1 && .Count() < 1但也没有用。

解决这个问题的正确方法是什么?我想我需要在查询之前合并两个数据表?

标签: c#linq

解决方案


你是如此接近:

var matched = from table1 in MainProcess.dt1.AsEnumerable()
    join table2 in MainProcess.dt2.AsEnumerable()
       on table1.Field<string>("MODEL") equals table2.Field<string>("MODEL")
    where table1.Field<string>("POWER") != table2.Field<string>("POWER")
        || table1.Field<string>("CLASS") != table2.Field<string>("CLASS")
    select new { table1, table2 };

var result = matched.SelectMany(x => new[] { x.table1, x.table2 })
    .CopyToDataTable();

推荐阅读