C# 如何比较两个数据表并返回仅包含不匹配数据的记录

C# 如何比较两个数据表并返回仅包含不匹配数据的记录,c#,linq,datatable,C#,Linq,Datatable,我试图比较两个数据表TableA和TableB 例如: 表A有7列5行。“货币”列是主键 表B 5列3行。“货币”列是主键 我想使用货币将表1A的每行数据与表B的行数据进行比较,并仅显示数据不匹配的行(U pto列比率4) 感谢您的帮助类似的事情也许: var q = from a in dtA.AsEnumerable() join b in dtB.AsEnumerable() on a.Field<string>("Currency") e

我试图比较两个数据表TableA和TableB

例如:

表A有7列5行。“货币”列是主键 表B 5列3行。“货币”列是主键

我想使用货币将表1A的每行数据与表B的行数据进行比较,并仅显示数据不匹配的行(U pto列比率4)


感谢您的帮助

类似的事情也许:

var q = from a in dtA.AsEnumerable()
        join b in dtB.AsEnumerable()
          on a.Field<string>("Currency") equals b.Field<string>("Currency")

        where a.Field<double>("Rate1") != b.Field<double>("Rate1") || 
              a.Field<double>("Rate2") != b.Field<double>("Rate2") || ....

        select new 
        {
            Currency = a.Field<string>("Currency"),
            Rate1    = a.Field<double>("Rate1") == b.Field<double>("Rate1") ? 
                           0 : a.Field<double>("Rate1"),
            Rate2    = a.Field<double>("Rate2") == b.Field<double>("Rate2") ? 
                           0 : a.Field<double>("Rate2"),
            ...
        };
var q=来自dtA.AsEnumerable()中的a
在dtB.AsEnumerable()中加入b
a.字段(“货币”)等于b.字段(“货币”)
其中a.Field(“Rate1”)!=b、 字段(“费率1”)||
a、 字段(“费率2”)!=b、 字段(“速率2”)| |。。。。
选择新的
{
货币=一个字段(“货币”),
Rate1=a.字段(“Rate1”)==b.字段(“Rate1”)?
0:a.字段(“费率1”),
Rate2=a.字段(“Rate2”)==b.字段(“Rate2”)?
0:a.字段(“费率2”),
...
};
var tableA=new DataTable();
表A.Columns.Add(“货币”,类型(字符串));
表A.列添加(“比率1”,类型(十进制));
表A.列添加(“比率2”,类型(十进制));
表A.列添加(“比率3”,类型(十进制));
表A.列添加(“比率4”,类型(十进制));
表A.列添加(“比率5”,类型(十进制));
表A.列添加(“比率6”,类型(十进制));
表A.行。加上(“美元”、1米、2米、3米、4米、5.5米、4.5米);
表A.行。加上(“日元”,1.11米、4.1米、3.3米、4.6米、5.5米、3.3米);
表A.行加上(“英镑”、3.0米、1米、3米、4米、7.7米、8.8米);
表A.新增行数(“欧元”、3.0m、1m、3m、4m、7.7m、8.8m);
表A.行添加(“MXN”,3.0m、1m、3m、4m、7.7m、8.8m);
var tableB=新数据表();
表B.列.添加(“货币”,类型(字符串));
表B.列添加(“比率1”,类型(十进制));
表B.列添加(“比率2”,类型(十进制));
表B.列添加(“比率3”,类型(十进制));
表B.列添加(“比率4”,类型(十进制));
表B.行加上(“美元”、1百万、2百万、3百万、4百万);
表B.新增行数(“日元”,1.11米、9.9米、3.3米、4.6米);
表B.行加上(“英镑”、3米、1米、3米、4米);
var query=来自tableA.AsEnumerable()中的r1
来自表B中的r2.AsEnumerable()
哪里
r1.字段(“货币”)==r2.字段(“货币”)
&&r1.字段(“费率1”)==r2.字段(“费率1”)
&&r1.字段(“费率2”)==r2.字段(“费率2”)
&&r1.字段(“费率3”)==r2.字段(“费率3”)
&&r1.字段(“费率4”)==r2.字段(“费率4”)
选择r2;
var result=tableB.AsEnumerable().Except(query.ToList();
试试这个:

DataTable dt = TableB.Clone();
dt = TableA.AsEnumerable().Join(TableB.AsEnumerable(),
                                row=>row.Field<string>(0),
                                row=>row.Field<string>(0), (a,b)=> new {a,b})
        .Select(pair=> {
          DataRow row = dt.NewRow();
          row.SetField<string>(0, pair.a.Field<string>(0));
          bool notNull = false;
          for(int i = 1; i < 5; i++){ 
            var a = pair.a.Field<decimal>(i);
            var b = pair.b.Field<decimal>(i);
            if(a == b) row.SetField<decimal>(i, 0);
            else {
               row.SetField<decimal>(i, Math.Max(a,b));
               notNull = true;
            }
          }
          return notNull ? row : null;
       }).Where(row=>row != null).CopyToDataTable();
DataTable dt=TableB.Clone();
dt=TableA.AsEnumerable().Join(TableB.AsEnumerable(),
行=>行字段(0),
row=>row.Field(0),(a,b)=>new{a,b})
.选择(配对=>{
DataRow row=dt.NewRow();
行设置字段(0,对a字段(0));
bool notNull=false;
对于(inti=1;i<5;i++){
var a=成对a场(i);
var b=成对b字段(i);
如果(a==b)行设置字段(i,0);
否则{
row.SetField(i,Math.Max(a,b));
notNull=true;
}
}
返回notNull?行:空;
}).Where(row=>row!=null).CopyToDataTable();

注意:我假设所有列
Rate X
中的数据类型都是
decimal
,第一列
Currency
当然是
string

您到目前为止尝试了什么?@Siva,我正在尝试循环表A并获取货币代码。使用货币,从表B中检索相应记录并比较数据。这是可行的,但代码看起来很糟糕。我的意思是,在实际的表中,总列数接近20Post您的代码@I want to use Linq instaed of foreach loop,我现在正在使用。仍然需要DataTable Foreach代码吗?感谢您的帮助谢谢Magnus,我将测试您的解决方案并尽快发布结果。
DataTable dt = TableB.Clone();
dt = TableA.AsEnumerable().Join(TableB.AsEnumerable(),
                                row=>row.Field<string>(0),
                                row=>row.Field<string>(0), (a,b)=> new {a,b})
        .Select(pair=> {
          DataRow row = dt.NewRow();
          row.SetField<string>(0, pair.a.Field<string>(0));
          bool notNull = false;
          for(int i = 1; i < 5; i++){ 
            var a = pair.a.Field<decimal>(i);
            var b = pair.b.Field<decimal>(i);
            if(a == b) row.SetField<decimal>(i, 0);
            else {
               row.SetField<decimal>(i, Math.Max(a,b));
               notNull = true;
            }
          }
          return notNull ? row : null;
       }).Where(row=>row != null).CopyToDataTable();