C# 如何使用Linq对两个DataTable按id左连接并取右表字段输出
错误点说明
- 语法错误:代码中出现两次
select关键字,同时变量名不匹配(定义的行变量为rowA、subRight,实际使用了不存在的rowLeft、rowRight,无法编译运行) - 关联字段写法错误:
rowA[id]中的id需要改为字段名字符串"id",否则会报变量不存在的错误 - 逻辑不符合需求:直接拼接两个行的
ItemArray会得到重复字段,也没有实现「匹配到表B时优先取表B的Age、Height值」的逻辑,字段数量和取值都不符合要求
正确实现
如果需要输出包含指定字段的匿名类集合,代码如下:
var results = from rowA in dA.AsEnumerable() join rowB in dB.AsEnumerable() on rowA["id"] equals rowB["id"] into dAB from subRight in dAB.DefaultIfEmpty() select new { Id = rowA["id"].ToString(), Name = rowA["Name"].ToString(), Age = subRight != null ? Convert.ToInt32(subRight["Age"]) : Convert.ToInt32(rowA["Age"]), Height = subRight != null ? Convert.ToInt32(subRight["Height"]) : Convert.ToInt32(rowA["Height"]) };
如果需要生成新的DataTable作为结果,可以用如下代码:
// 先构造结果表结构 DataTable resultDt = new DataTable(); resultDt.Columns.Add("id", typeof(string)); resultDt.Columns.Add("Name", typeof(string)); resultDt.Columns.Add("Age", typeof(int)); resultDt.Columns.Add("Height", typeof(int)); // 填充数据 var query = from rowA in dA.AsEnumerable() join rowB in dB.AsEnumerable() on rowA["id"] equals rowB["id"] into dAB from subRight in dAB.DefaultIfEmpty() select resultDt.LoadDataRow(new object[] { rowA["id"], rowA["Name"], subRight != null ? subRight["Age"] : rowA["Age"], subRight != null ? subRight["Height"] : rowA["Height"] }, false); // 执行查询填充表 query.ToList();
如果不需要保留表A中未匹配到表B的记录,把左连接改为内连接即可,删除into dAB和from subRight in dAB.DefaultIfEmpty()两行,直接在join后取值即可。
内容的提问来源于stack exchange,提问作者Calvin Creater
相关产品推荐
相关产品推荐

