我正在尝试在动态的列数上连接两个DataTable。我已经到了下面的代码。问题是联接的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 $ 25500

加拿大Test3 Ltd 20160723 30美元

墨西哥Test2 Ltd 20160723 300

意大利Test4 Ltd 20160724 $ 40 900

印度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 };


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

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

10-10 01:01