C#合并DataTable新增列时如何保留无匹配值的行并补空值
问题原因
你当前的代码仅在匹配到第二个表的符合条件记录时才往新表插入行,未匹配的行直接被跳过,因此只会保留匹配成功的记录。
修改方案
调整遍历逻辑,无论是否匹配到记录都往新表插入行,未匹配时Function列赋值为空即可,修改后代码如下:
DataTable test = dtFinal.Clone(); test.Columns.Add("Function"); foreach (DataRow row in dtFinal.Rows) { DataRow[] FunctionData = customPropertiesTable.Select(string.Format("ItemId='{0}' AND Title ='Function'", Convert.ToString(row["ItemId"]))); // 先构造行的字段集合 var lst = row.ItemArray.ToList(); if (FunctionData != null && FunctionData.Length > 0) { // 匹配到就加对应值 lst.Add(FunctionData[0]["ItemTitle"].ToString()); } else { // 未匹配加空值,需要空字符串的话可以替换为 string.Empty lst.Add(DBNull.Value); } // 统一添加行,保证所有原表行都保留 test.Rows.Add(lst.ToArray()); }
注意:如果你的ItemId字段是数值类型(比如int),需要把Select查询语句里的单引号去掉,避免查询语法报错。
可选优化(大数据量场景)
如果两表数据量较大,每次遍历都调用Select全表查询效率偏低,可以提前把第二个表中符合条件的记录按ItemId存为字典,仅查询一次第二个表:
// 提前构造ItemId到ItemTitle的映射字典 var funcMap = customPropertiesTable.AsEnumerable() .Where(r => r.Field<string>("Title") == "Function") .ToDictionary( r => r.Field<string>("ItemId"), r => r.Field<string>("ItemTitle") ); DataTable test = dtFinal.Clone(); test.Columns.Add("Function"); foreach (DataRow row in dtFinal.Rows) { var lst = row.ItemArray.ToList(); string itemId = row.Field<string>("ItemId"); lst.Add(funcMap.TryGetValue(itemId, out var title) ? title : DBNull.Value); test.Rows.Add(lst.ToArray()); }
内容的提问来源于stack exchange,提问作者lross15
相关产品推荐
相关产品推荐

