使用部分列名称使用LINQ Query DataTable

时间:2013-11-07 16:41:52

标签: c# linq datatable

我有一个具有可变列数的DataTable。 我想创建一个LINQ查询,该查询返回以'B_'开头的列中的数据。 我有一个查询返回以'B_'开头的列名。它在下面:

var arrayNames = (from DataColumn x in stationTable.Columns
                          where x.ColumnName.Contains("B_")
                          select x.ColumnName).ToArray();

现在我有列名如何使用此数组创建查询以返回列中的数据?

由于

2 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题。

如果您不关心按列类型对项目进行分组,则此查询将完成:

var query = from DataColumn col in stationTable.Columns
            from DataRow row in stationTable.Rows
            where col.ColumnName.StartsWith("B_")
            select row[col.ColumnName];

但是,要维护分组,可以按如下方式使用查找:

var query = (from DataColumn col in stationTable.Columns
            from DataRow row in stationTable.Rows
            where col.ColumnName.StartsWith("B_")
            select new { Row = row[col.ColumnName], col.ColumnName })
            .ToLookup(o => o.ColumnName, o => o.Row);

foreach (var group in query)
{
    Console.WriteLine("ColumnName: {0}", group.Key);
    foreach (var item in group)
    {
        Console.WriteLine(item);
    }
}

这两种方法的缺点是你最终得到object。考虑到问题的动态性,以强类型方式保留结果需要一些额外的工作。

答案 1 :(得分:0)

您可以创建一个隐藏列表而不是DataView - 这样您就可以保留任何类型信息:

var arrayNames = (from DataColumn x in stationTable.Columns
                          where !x.ColumnName.Contains("B_")  // note the reversal
                          select x.ColumnName).ToArray();

DataView dv = new DataView(stationTable);

foreach (string colName in arrayNames)    
    dv.Table.Columns[colName].ColumnMapping = MappingType.Hidden