0

我被这个难住了。

我正在尝试将两个DataTables 合并为一个。最好我会用它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动态添加主键之前创建 a 之类的东西。

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

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

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

我正在使用VS2012。

4

1 回答 1

0

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

基本上我已经在Linq 中调整了解决方案,动态添加 where 条件,而不是加入我动态添加.Where-clauses。

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

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...
}

每一行都与第二个结果集中的递减行列表进行比较。

于 2013-03-20T17:38:41.000 回答