2013-03-19 118 views
0

我很难过这个。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] } 

需要的东西来代替,如创建表之间或执行linq动态地添加的主键之前DataRelation

ALSO,我需要选择像SQLS *而不是指定每一列,因为我不知道列的第一个结果集数。

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

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

我正在使用VS2012。

回答

0

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

基本上我已经适应了Linq dynamically adding where conditions的解决方案,而不是加入我动态地添加.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... 
} 

每一行都被相比,在第二个结果集行的递减列表。