2013-03-19 28 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... 
} 

每一行都被相比,在第二個結果集行的遞減列表。