如何使用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会完全符合你的预期:
| id | Name | Age(匹配时取表B的值) | Height(匹配时取表B的值) |
|---|---|---|---|
| 01 | Pauls | 23 | 175 |
| 02 | Sam | 21 | 190 |
| 03 | Mike | 20 | 175 |
| 04 | Jame | 23 | 180 |
内容的提问来源于stack exchange,提问作者calvin creater
相关产品推荐
相关产品推荐

