我有一个具有可变列数的DataTable。 我想创建一个LINQ查询,该查询返回以'B_'开头的列中的数据。 我有一个查询返回以'B_'开头的列名。它在下面:
var arrayNames = (from DataColumn x in stationTable.Columns
where x.ColumnName.Contains("B_")
select x.ColumnName).ToArray();
现在我有列名如何使用此数组创建查询以返回列中的数据?
由于
答案 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