C# 格式化查询以枚举2个不同的数据表

C# 格式化查询以枚举2个不同的数据表,c#,linq,datatable,C#,Linq,Datatable,我有两个数据表sendTable和recvTable 它们都有相同的列名和列数 “节点”“DSP名称”“总线”“标识”“站”“参考1”“参考2”“参考3”“参考4”“参考5”“参考6”“参考7”“参考8” 我需要比较这两个表并分离出不匹配项,只检查第3-11列,忽略第1列和第2列 我首先尝试删除2列,然后逐行循环并返回匹配和不匹配,但这种方法的问题是,当我最终确定结果时,我不再有与行关联的“节点”和“DSP名称” 所以我需要一个问题的帮助 这是我的尝试 var samerecordQuery =

我有两个数据表
sendTable
recvTable

它们都有相同的列名和列数

“节点”“DSP名称”“总线”“标识”“站”“参考1”“参考2”“参考3”“参考4”“参考5”“参考6”“参考7”“参考8”

我需要比较这两个表并分离出不匹配项,只检查第3-11列,忽略第1列和第2列

我首先尝试删除2列,然后逐行循环并返回匹配和不匹配,但这种方法的问题是,当我最终确定结果时,我不再有与行关联的“节点”和“DSP名称”

所以我需要一个问题的帮助

这是我的尝试

var samerecordQuery = from r1 in sendTable.AsEnumerable()
                      where r1.Field<int>("BUS").Equals(from r2 in recvTable.AsEnumerable() where r2.Field<int>("BUS"))   
一旦我有了这个,我就可以使用except来找出不匹配的部分了

希望这有帮助

var matched = from s in sendTable.AsEnumerable()
              join r in recvTable.AsEnumerable() on
              new {BUS = s.Field<int>("BUS"), IDENT = s.Field<int>("IDENT"),...} equals
              new {BUS = r.Field<int>("BUS"), IDENT = r.Field<int>("IDENT"),...}
              select new {Send = s, Receive = r};
var matched=来自sendTable.AsEnumerable()中的s
在上的recvTable.AsEnumerable()中加入r
新的{BUS=s.Field(“BUS”),IDENT=s.Field(“IDENT”),…}等于
新{BUS=r.Field(“BUS”),IDENT=r.Field(“IDENT”),…}
选择新{Send=s,Receive=r};
这将根据您需要的任何列匹配两个表中的记录,并返回分组的匹配记录。

这是我的解决方案

var matched = from s in sendTable.AsEnumerable()
                     join r in recvTable.AsEnumerable() on
                     new { BUS = s.Field<int>("BUS"), 
                           IDENT = s.Field<int>("IDENT"), 
                           STATION = s.Field<int>("STATION"), 
                           REF1 = s.Field<string>("REF1"), 
                           REF2 = s.Field<string>("REF2"),
                           REF3 = s.Field<string>("REF3"),
                           REF4 = s.Field<string>("REF4"),
                           REF5 = s.Field<string>("REF5"),
                           REF6 = s.Field<string>("REF6"),
                           REF7 = s.Field<string>("REF7"),
                           REF8 = s.Field<string>("REF8") } equals
                      new { BUS = r.Field<int>("BUS"), 
                           IDENT = r.Field<int>("IDENT"), 
                           STATION = r.Field<int>("STATION"), 
                           REF1 = r.Field<string>("REF1"), 
                           REF2 = r.Field<string>("REF2"),
                           REF3 = r.Field<string>("REF3"),
                           REF4 = r.Field<string>("REF4"),
                           REF5 = r.Field<string>("REF5"),
                           REF6 = r.Field<string>("REF6"),
                           REF7 = r.Field<string>("REF7"),
                           REF8 = r.Field<string>("REF8") } 
                     select new { Send = s, Receive = r };
var matched=来自sendTable.AsEnumerable()中的s
在上的recvTable.AsEnumerable()中加入r
新{BUS=s.Field(“BUS”),
IDENT=s.字段(“IDENT”),
桩号=s.场(“桩号”),
参考1=s.字段(“参考1”),
REF2=s.字段(“REF2”),
REF3=s.字段(“REF3”),
REF4=s.字段(“REF4”),
参考5=s.字段(“参考5”),
REF6=s.字段(“REF6”),
参考7=s.字段(“参考7”),
REF8=s.Field(“REF8”)}等于
新的{BUS=r.Field(“BUS”),
识别=r.字段(“识别”),
车站=右场(“车站”),
REF1=r.字段(“REF1”),
REF2=r.字段(“REF2”),
REF3=r.字段(“REF3”),
REF4=r.字段(“REF4”),
REF5=r.字段(“REF5”),
REF6=r.字段(“REF6”),
参考7=r.字段(“参考7”),
REF8=r.Field(“REF8”)}
选择新{Send=s,Receive=r};

它告诉我错误r1不在等式右侧的范围内请参阅我编辑的查询,我使用的是您的标识符r1和r2,它们应该是s和r。此外,还必须将其他列添加到join语句中;这就是为什么我在每个“新”声明的末尾都有“…”的原因。如果您使用Arturo Martinez的答案得出这个解决方案,请将他的答案标记为应该给予信任的答案。特定代码没有一般代码重要,这看起来像是为您发布的答案的具体实现。
var matched = from s in sendTable.AsEnumerable()
                     join r in recvTable.AsEnumerable() on
                     new { BUS = s.Field<int>("BUS"), 
                           IDENT = s.Field<int>("IDENT"), 
                           STATION = s.Field<int>("STATION"), 
                           REF1 = s.Field<string>("REF1"), 
                           REF2 = s.Field<string>("REF2"),
                           REF3 = s.Field<string>("REF3"),
                           REF4 = s.Field<string>("REF4"),
                           REF5 = s.Field<string>("REF5"),
                           REF6 = s.Field<string>("REF6"),
                           REF7 = s.Field<string>("REF7"),
                           REF8 = s.Field<string>("REF8") } equals
                      new { BUS = r.Field<int>("BUS"), 
                           IDENT = r.Field<int>("IDENT"), 
                           STATION = r.Field<int>("STATION"), 
                           REF1 = r.Field<string>("REF1"), 
                           REF2 = r.Field<string>("REF2"),
                           REF3 = r.Field<string>("REF3"),
                           REF4 = r.Field<string>("REF4"),
                           REF5 = r.Field<string>("REF5"),
                           REF6 = r.Field<string>("REF6"),
                           REF7 = r.Field<string>("REF7"),
                           REF8 = r.Field<string>("REF8") } 
                     select new { Send = s, Receive = r };