C#如何按userno匹配过滤合并两个DataTable(LINQ实现)
DataTable按字段关联合并实现方案
LINQ原生支持DataTable的关联操作,只要引入System.Data.DataSetExtensions程序集,就可以通过AsEnumerable()扩展方法对DataTable执行LINQ查询,完全可以实现你需要的按userno匹配合并的需求。
实现代码
using System.Data; using System.Linq; public DataTable MergeByUserno(DataTable table1, DataTable table2) { // 初始化结果表结构 DataTable result = new DataTable(); result.Columns.Add("id", typeof(int)); result.Columns.Add("user", typeof(string)); result.Columns.Add("userno", typeof(string)); result.Columns.Add("secondid", typeof(int)); // 按userno做内连接查询,仅保留两边匹配成功的行 var joinResult = from row1 in table1.AsEnumerable() join row2 in table2.AsEnumerable() on row1.Field<string>("userno") equals row2.Field<string>("userno") select new { id = row1.Field<int>("id"), user = row1.Field<string>("user"), userno = row1.Field<string>("userno"), secondid = row2.Field<int>("id") }; // 填充结果到DataTable foreach (var item in joinResult) { DataRow newRow = result.NewRow(); newRow["id"] = item.id; newRow["user"] = item.user; newRow["userno"] = item.userno; newRow["secondid"] = item.secondid; result.Rows.Add(newRow); } return result; }
注意事项
- 上述代码使用内连接逻辑,只会返回两个表中userno完全匹配的记录,符合过滤合并的要求
- 如果实际业务中字段类型和示例不一致(比如id为long类型、userno存在空值),只需要调整
Field<T>()方法的泛型参数、增加空值判断即可 - 如果需要保留table1中所有未匹配到table2的记录,可以将内连接修改为左连接写法,未匹配到的secondid字段赋值
DBNull.Value - 执行前请确认项目已经引用
System.Data.DataSetExtensions,否则无法使用DataTable的LINQ扩展方法
内容的提问来源于stack exchange,提问作者darby
相关产品推荐
相关产品推荐

