You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:42:00