这两天处理DataTable时用到了Linq去Join两张表
下面是具体实例
需求:表dt_A有列ID、A、B表dt_B有列ID、C、D,要求生成表C,包含列ID、A、B、C、D,具体的数据为 表dt_A join 表dt_B 的结果集,方法如下
private DataTable JoinDataTables(DataTable dt_A, DataTable dt_B, params Func<DataRow, DataRow, bool>[] joinOn)
{
DataTable dtResult = new DataTable();
foreach (DataColumn col in dt_A.Columns)
{
if (dtResult.Columns[col.ColumnName] == null)
dtResult.Columns.Add(col.ColumnName, col.DataType);
}
foreach (DataColumn col in dt_B.Columns)
{
if (dtResult.Columns[col.ColumnName] == null)
dtResult.Columns.Add(col.ColumnName, col.DataType);
}
foreach (DataRow rowA in dt_A.Rows)
{
var joinRows = dt_B.AsEnumerable().Where(rowB =>
{
foreach (var parameter in joinOn)
{
if (!parameter(rowA, rowB)) return false;
}
return true;
});
foreach (DataRow fromRow in joinRows)
{
DataRow insertRow = dtResult.NewRow();
foreach (DataColumn colA in dt_A.Columns)
{
insertRow[colA.ColumnName] = rowA[colA.ColumnName];
}
foreach (DataColumn colB in dt_B.Columns)
{
insertRow[colB.ColumnName] = fromRow[colB.ColumnName];
}
dtResult.Rows.Add(insertRow);
}
}
return dtResult;
}
下面是具体实例
var vResult = JoinDataTables(dt_A, dt_B,
(rowA, rowB) =>
rowA.Field<string>("ID") == rowB.Field<string>("ID"));
由于要写的通用,性能不是最优化的,所以要注意数据量。
另外,如果已经知道表dt_A的数据量大于表dt_B的数据量,可以将表dt_B放在第一位来提高Join的速度。