C#中使用LINQ的DataTable Join
本文关键字:DataTable Join LINQ | 更新日期: 2023-09-27 18:29:37
我以这种方式使用LINQ连接两个数据表:
DataTable targetTable = dataTable1.Clone();
var dt2Columns = dataTable2.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
where targetTable.Columns.Contains(dc.ColumnName) == false
select dc;
targetTable.Columns.AddRange(dt2FinalColumns.ToArray());
var rowData = from row1 in dataTable1.AsEnumerable()
join row2 in dataTable2.AsEnumerable()
on row1.Field<string>("keyCol") equals row2.Field<string>("keyCol")
select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
foreach (object[] values in rowData)
targetTable.Rows.Add(values);
我在这里面临三个问题:
- 如果两个表的行数不相同,我想传递默认值或为其他表中找不到的值分配空字符串。我该如何做到这一点
- 如果我有多个列,并且需要与and进行比较,这怎么可能呢
- 如果我必须在运行时加入多个表,该怎么办。有什么方法可以生成动态LINQ吗
如果两个表都有相同的主键,DataTable.Merge
将起作用:
dataTable1.Merge(dataTable2 ,false, MissingSchemaAction.Add);
这将合并两个表的架构(列),连接具有相同主键的行,并添加其他行。