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

如何使用C# Linq实现两个DataTable的左连接并获取指定输出结果

解决C# Linq左连接DataTable并替换匹配值的问题

你当前的代码用的是内连接(标准join语法),所以只会返回两个表中id匹配的行。要实现你需要的左连接(保留Table A所有行,匹配时优先用Table B的Age和Height,不匹配时保留Table A原值),得结合DefaultIfEmpty()实现左外连接,具体方案如下:

正确的Linq查询及DataTable转换代码

// 执行左连接查询,处理匹配/不匹配的字段取值逻辑
var query = from ta in tableA.AsEnumerable()
            join tb in tableB.AsEnumerable() 
            on ta["id"] equals tb["id"] into joinedGroup
            from tb in joinedGroup.DefaultIfEmpty() // 左连接核心:无匹配时tb为null
            select new
            {
                Id = ta["id"],
                Name = ta["Name"],
                Age = tb != null ? tb["Age"] : ta["Age"],
                Height = tb != null ? tb["Height"] : ta["Height"]
            };

// 将查询结果转换为目标结构的DataTable
DataTable outputTable = new DataTable();
outputTable.Columns.Add("id", typeof(string));
outputTable.Columns.Add("Name", typeof(string));
outputTable.Columns.Add("Age(匹配时取表B的值)", typeof(int));
outputTable.Columns.Add("Height(匹配时取表B的值)", typeof(int));

foreach (var item in query)
{
    outputTable.Rows.Add(item.Id, item.Name, item.Age, item.Height);
}

关键逻辑说明

  • join ... into joinedGroup:把Table A的每行和匹配的Table B行做分组关联
  • from tb in joinedGroup.DefaultIfEmpty():如果当前Table A的行没有匹配的Table B行,tb会被设为null,这是实现左外连接的核心
  • 字段赋值:通过判断tb是否为null,决定取B表的新值还是A表的原值
  • 手动构建DataTable:因为Linq返回的是匿名对象集合,需要手动创建对应结构的DataTable并填充数据,得到你需要的最终输出表

最终输出效果

运行代码后,outputTable会完全符合你的预期:

idNameAge(匹配时取表B的值)Height(匹配时取表B的值)
01Pauls23175
02Sam21190
03Mike20175
04Jame23180

内容的提问来源于stack exchange,提问作者calvin creater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:37:44