Linq将DataTable与动态添加的主键合并

时间:2013-03-19 10:30:43

标签: c# linq datatable

我很难过这个。

我正在尝试将两个DataTable合并为一个。我最好使用linq来执行此任务,但问题是我需要动态添加连接条件。每个表的数据来自对存储过程的两个不同调用以及可以切换使用的调用。因此,结果可以在列数和主键可用方面有所不同 目标是用第二个可以包含unicode的数据库替换第一个结果集中的常规字符串(但仅当它包含特定主键组合的值时)。

我的linq查询看起来像这样:

var joined = (from DataRow reg in dt1.Rows
                 join DataRow uni in dt2.Rows
                     on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
                     equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] }
                 select new
                     {
                         prim1 = reg.ItemArray[0],
                         prim2 = reg.ItemArray[1],
                         value1 = reg.ItemArray[4],
                         value2 = uni.ItemArray[3] ?? reg.ItemArray[3]
                     }
                );

这完全符合我的要求,但正如我所说,我需要能够定义每个表中哪些列是主键,所以这个:

join DataRow uni in dt2.Rows
                     on new { prim1 = reg.ItemArray[0], prim2 = reg.ItemArray[1] }
                     equals new { prim1 = uni.ItemArray[0], prim2 = uni.ItemArray[1] } 

需要替换为在表之间创建DataRelation或在执行linq动态添加主键之前。

ALSO ,我需要选择类似SQL *的内容而不是指定每一列,因为我不知道第一个结果集中的列数。

我还尝试通过添加主键和进行合并来加入表,但是如何选择dt2中的哪一列覆盖dt1中的哪一列?

DataTable join = new DataTable("joined");
join = dt1.Copy();
join.Merge(dt2, false, MissingSchemaAction.Add);
join.AcceptChanges();

我正在使用VS2012。

1 个答案:

答案 0 :(得分:0)

我最终使用了一种非常简单的方法,它不涉及创建主键关系或连接。我确信有更优雅或有效的方法来解决问题。

基本上我已经在Linq dynamically adding where conditions中修改了解决方案,而不是加入我动态添加.Where - 子句。

这样我就可以遍历行并比较每个动态添加的主键:

foreach (DataRow regRow in dt1.Rows)
{
    //Select all rows in second result set
    var uniRows = (from DataRow uniRow in dt2.Rows select uniRow);
    //Add where clauses as needed
    if (firstCondition) { uniRows = uniRows.Where(x => x["SalesChannel"] == "001"); }
    else if (secondCondition) { uniRows = uniRows.Where(x => x["Language"] == "SV"); }
    else (thirdCondition) { uniRows = uniRows.Where(x => x["ArticleNo"] == "242356"); }
    // etc...
}

将每行与第二个结果集中逐行减少的行列表进行比较。