gpt4 book ai didi

c# - 在动态列数上加入 2 个数据表

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:43 25 4
gpt4 key购买 nike

我正在尝试在动态列数上连接两个数据表。我已经得到了下面的代码。问题是连接的 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 个连接列(国家/地区、公司和 DateId)显示输入/输出:

拉X:

Country        Company       DateId    SalesUnited States  Test1 Ltd    20160722    $25 Canada         Test3 Ltd    20160723    $30 Italy          Test4 Ltd    20160724    $40 India          Test2 Ltd    20160725    $35 

拉 Y:

Country        Company       DateId    DownloadsUnited States  Test1 Ltd    20160722    500 Mexico         Test2 Ltd    20160723    300 Italy          Test4 Ltd    20160724    900 

结果:

Country        Company       DateId    Sales    DownloadsUnited States  Test1 Ltd    20160722    $25      500 Canada         Test3 Ltd    20160723    $30  Mexico         Test2 Ltd    20160723                300 Italy          Test4 Ltd    20160724    $40      900 India          Test2 Ltd    20160725    $35      

最佳答案

var Join = 
from PX in pullX.AsEnumerable()
join PY in pullY.AsEnumerable()
on string.Join("\0", joinColumnNames.Select(c => PX[c]))
equals string.Join("\0", joinColumnNames.Select(c => PY[c]))
into Outer
from PY in Outer.DefaultIfEmpty<DataRow>(pullY.NewRow())
select new { PX, PY };

另一种方法是在 DataSet 中同时使用 DataTable 并使用 DataRelation
How To: Use DataRelation to perform a join on two DataTables in a DataSet?

关于c# - 在动态列数上加入 2 个数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com