如何使用LINQ从DataTable中进行选择,并列出所需的列名称

时间:2012-08-24 18:55:33

标签: c# linq linq-to-objects

我有一些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函数(对我来说也是相当新的)从每行中删除不需要的列,并输出带有一些删除列的新数据表。

任何关于如何解决此问题的建议/建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

MSDN refs