2012-09-06 49 views
2

不知道这是否可能,但我有一个DataRow row,我想检索列名以“FK”开头的所有值的字符串数组。DataRow上复杂的LINQ

这是可行的还是我要求大部分LINQ?

+1

如果至少有一个值不是字符串而是别的东西(一个int也许),那么就会崩溃。使用'ToString'或'Convert.ToString'如在答案中显示的那样更安全。 –

回答

4

如何:

DataRow row = ... 

var values = from DataColumn column in row.Table.Columns 
      where column.ColumnName.StartsWith("FK") 
      select Convert.ToString(row[column]); 

var valueArray = values.ToArray(); 

如果你想要的结果作为一个地图,而不是,你可以这样做:

var result = row.Table 
       .Columns 
       .Cast<DataColumn>() 
       .Where(column => column.ColumnName.StartsWith("FK")) 
       .ToDictionary(column => column.ColumnName, 
           column => Convert.ToString(row[column])); 
2
DataTable dt = new System.Data.DataTable(); 
dt.Columns.Add("FKStuff"); 
dt.Columns.Add("OtherStuff"); 
dt.Columns.Add("FKAndMoreStuff"); 

var row = dt.Rows.Add("ABC", "DEF", "GHI"); 
var vals = dt.Columns.Cast<DataColumn>().Where(c => c.ColumnName.StartsWith("FK")).Select(col => row[col]).ToArray(); 
2

您可以使用此:

var values = row.Table.Columns.Cast<DataColumn>() 
       .Where(x => x.ColumnName.StartsWith("FK")) 
       .Select(x => row[x].ToString()) 
       .ToArray(); 
2
var sa = (from DataColumn x in row.Table.Columns 
      where x.ColumnName.StartsWith("FK") 
      select row[x].ToString()).ToArray(); 

这里的逻辑是获取名称以“FK”开头的那些列的序列,然后为每个列选择该列的行值,将其转换为字符串,然后从结果中创建一个数组。如果你不需要一个实际的数组,那么就离开.ToArray()和额外的一组括号。