2012-08-24 48 views
0

我將一些DataTables從各種來源(SQL和MS Access)加載到內存中,每個數據集都有幾列,只有一列每個數據集之間的列相同。我正在研究一些數據同步代碼,我想比較這些數據表,但只是根據它們共同的列進行比較。如果我不得不這樣做,我可能會用很多循環來做到這一點,但是我希望更適應LINQ並有更簡潔的代碼。如何使用LINQ從DataTable中選擇所需的列名稱列表

到目前爲止,我已經成功地從每個DataTable獲得列名稱的列表,並使用相交來獲得列名的共同清單,他們兩個,像這樣:

private string[] Common_ColumnNames { 
    get { 
     // get column names from source & destination data 
     string[] src_columnNames = 
     (from dc in _srcDataTable.Columns.Cast<DataColumn>() 
     select dc.ColumnName).ToArray(); 

     string[] dest_columnNames = 
     (from dc in _destDataTable.Columns.Cast<DataColumn>() 
     select dc.ColumnName).ToArray(); 

     // find the column names common between the two data sets 
     // - these are the columns to be compared when synchronizing 
     return src_columnNames.Intersect(dest_columnNames).ToArray();     
    } 
} 

現在的我m卡住......我需要從每個DataTable中選擇所有行,但只能使用這些公共列。在我的腦子裏,我看到這方面的工作了幾個不同的方式:

1)從數據表中選擇所有的行,並通過在我需要的列清單的String []變量告訴LINQ我想

2)選擇哪些列來自數據表的所有行,並使用一些lambda函數(對我來說也是相當新的)從每行刪除不需要的列,然後使用一些刪除的列輸出新的數據表。

任何意見/建議如何拉這個關閉,將不勝感激。謝謝!

+0

我明白你只是要比較它們共有的列很簡單,但爲什麼試圖剝離你不想要的專欄,爲什麼不直接忽略它們?你最終需要做的事就是用*只是*所需的列構建一個新的數據表,然後從其他表中取出行並根據新的數據表創建新行並導入值進入那些新的行。你實際上不能從一行中刪除列。 – CodingGorilla

回答

1

嗯,這是不是LINQ中,但它是一個DataView

string[] commonCols = obj.Common_Columns; 
DataView myTableView = new DataView(srcDataTable); 
DataTable srcReducedTable = myTableView.ToTable(false, commonCols); 

MSDN refs

+0

簡單是國王......謝謝,這將工作得很好 –

相關問題