【问题标题】:How do I use LINQ to select from DataTable, with a list of the required column names如何使用 LINQ 从 DataTable 中进行选择,并列出所需的列名
【发布时间】:2012-08-24 18:55:33
【问题描述】:

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

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

【问题讨论】:

  • 我知道您只想比较它们共有的列,但是为什么要尝试删除您不想要的列,为什么不忽略它们呢?你最终需要做的是用just你想要的列构建一个新的数据表,然后从其他表中获取行并根据新数据创建新行表并将值导入这些新行。您实际上不能从一行中删除列。

标签: c# linq linq-to-objects


【解决方案1】:

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

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

MSDN refs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多