我有一些DataTable从各种来源(SQL和MS Access)加载到内存中,每个数据集都有几列,每个数据集之间只有一列相同的列。我正在研究一些数据同步代码,我想比较这些数据表,但只根据它们共有的列进行比较。如果我不得不这样做,我可以用很多循环来做这件事,但我希望LINQ更加舒适并且代码更简洁。
到目前为止,我已经设法从每个数据表中获取列名列表,并使用Intersect获取两者共有的列名列表,如下所示:
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();
}
}
现在我被卡住了......我需要从每个DataTable中选择所有行,但只能选择那些常用列。在我看来,我认为这有两种不同的方式:
1)从数据表中选择所有行,然后传入我想要的列列表string []变量,告诉LINQ我想要哪些列
2)从数据表中选择所有行,并使用一些lambda函数(对我来说也是相当新的)从每行中删除不需要的列,并输出带有一些删除列的新数据表。
任何关于如何解决此问题的建议/建议将不胜感激。谢谢!
答案 0 :(得分:1)
嗯,它不是LinQ,但使用DataView非常简单
string[] commonCols = obj.Common_Columns;
DataView myTableView = new DataView(srcDataTable);
DataTable srcReducedTable = myTableView.ToTable(false, commonCols);