0

我有一些从各种来源(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)从数据表中选择所有行,并传入我想要的列列表字符串 [] 变量来告诉 LINQ 我想要哪些列

2)从数据表中选择所有行,并使用一些 lambda 函数(对我来说也是相当新的)从每一行中删除不需要的列,并输出一个包含一些删除列的新数据表。

任何有关如何实现这一目标的建议/建议将不胜感激。谢谢!

4

1 回答 1

1

好吧,它不是 LinQ,但使用 DataView 非常简单

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

MSDN 参考

于 2012-08-24T19:19:24.717 回答