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 };