【发布时间】:2016-08-04 22:17:58
【问题描述】:
我正在尝试在动态列数上加入两个数据表。我已经了解了下面的代码。问题是连接的 ON 语句。如何根据列表“joinColumnNames”中的列名数量来实现这一动态。
我在想我需要构建某种表达式树,但我找不到任何示例说明如何使用多个连接列以及每个列都没有属性的 DataRow 对象来执行此操作。
private DataTable Join(List<string> joinColumnNames, DataTable pullX, DataTable pullY)
{
DataTable joinedTable = new DataTable();
// Add all the columns from pullX
foreach (string colName in joinColumnNames)
{
joinedTable.Columns.Add(pullX.Columns[colName]);
}
// Add unique columns from PullY
foreach (DataColumn col in pullY.Columns)
{
if (!joinedTable.Columns.Contains((col.ColumnName)))
{
joinedTable.Columns.Add(col);
}
}
var Join = (from PX in pullX.AsEnumerable()
join PY in pullY.AsEnumerable() on
// This must be dynamic and join on every column mentioned in joinColumnNames
new { A = PX[joinColumnNames[0]], B = PX[joinColumnNames[1]] } equals new { A = PY[joinColumnNames[0]], B = PY[joinColumnNames[1]] }
into Outer
from PY in Outer.DefaultIfEmpty<DataRow>(pullY.NewRow())
select new { PX, PY });
foreach (var item in Join)
{
DataRow newRow = joinedTable.NewRow();
foreach (DataColumn col in joinedTable.Columns)
{
var pullXValue = item.PX.Table.Columns.Contains(col.ColumnName) ? item.PX[col.ColumnName] : string.Empty;
var pullYValue = item.PY.Table.Columns.Contains(col.ColumnName) ? item.PY[col.ColumnName] : string.Empty;
newRow[col.ColumnName] = (pullXValue == null || string.IsNullOrEmpty(pullXValue.ToString())) ? pullYValue : pullXValue;
}
joinedTable.Rows.Add(newRow);
}
return joinedTable;
}
添加一个特定示例以使用 3 个连接列(国家、公司和日期 ID)显示输入/输出:
拉 X:
国家公司 DateId 销售 美国 Test1 Ltd 20160722 25 美元 加拿大 Test3 Ltd 20160723 30 美元 意大利 Test4 Ltd 20160724 40 美元 印度 Test2 Ltd 20160725 35 美元
拉 Y:
国家公司 DateId 下载 美国Test1 Ltd 20160722 500 墨西哥 Test2 Ltd 20160723 300 意大利Test4 Ltd 20160724 900
结果:
国家 公司 DateId 销售 下载 美国 Test1 Ltd 20160722 25 500 美元 加拿大 Test3 Ltd 20160723 30 美元 墨西哥 Test2 Ltd 20160723 300 意大利 Test4 Ltd 20160724 40 900 美元 印度 Test2 Ltd 20160725 35 美元【问题讨论】:
-
你能给出一个示例输入和输出吗?不在“joinColumnNames”中的“pullX”列呢?您不想在输出中包含这些列吗?
-
是的,输出应该包含来自 x 和 y 的所有列。我添加了一个具体的例子。
标签: c# linq datatable expression-trees