2

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

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

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

谢谢

4

2 回答 2

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
于 2013-11-07T17:51:05.020 回答
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. 考虑到问题的动态性质,以强类型方式保留结果需要一些额外的工作。

于 2013-11-07T17:35:28.370 回答