2016-07-28 99 views
1

我有以下表结构。我想检索每个组名称对应的键的值并插入它将它按顺序存储在模型类中C#使用linq将列转换为行?

表格数据已经使用ExecuteQuery读取并存储在类对象列表中,在下面的示例中我将有4行返回。我需要将它转换成2行,列值以行的形式出现。

Table Data Structure
我现在写了下面的代码,但有没有其他的方法来验证它不显式检查说Key == "GroupSpecificProperty1"

如果有后来加了第三类,我不应该修改这个代码

Result = results.GroupBy(p => p.GroupName) 
       .Select(g => new FinalModel() 
    { 
     GroupName = g.Select(p => p.GroupName).FirstOrDefault(), 
     GroupSpecificProperty1 = g.Where(q => q.Key == "GroupSpecificProperty1").Select(v => v.Value).Cast<string>().FirstOrDefault(), 
     GroupSpecificProperty2= g.Where(q => q.Key == "GroupSpecificProperty2").Select(v => v.Value).Cast<string>().FirstOrDefault(), 
    }).ToList(); 
+0

你有可能根据另一个问题写了这个话题吗?无法获得'将列转换为行“部分!? – C4u

+1

如果添加第三个类别,则必须修改'FinalModel',除非您想用动态类型替换它。那个或'FinalModel'可以包含一个'Dictionary '。 – juharr

+0

嗯好点,你有没有看到其他方式来实现我的结果,而不是我写的方式? – KeenUser

回答

3
results.GroupBy(p => p.GroupName) 
      .Select(g => new FinalModel 
      { 
       GroupName = g.Key, 
       Properties = g.ToDictionary(item => item.Key, item=> item.Value) 
      }); 

而在情况下,对于给定GroupName键是不是唯一的,你会要避免“键已经存在”异常,那么你可以:

results.GroupBy(p => p.GroupName) 
     .Select(g => new FinalModel 
     { 
      GroupName = g.Key, 
      Properties = g.GroupBy(item => item.key) 
          .ToDictionary(innerGroup => innerGroup.Key, 
             innerGroup => innerGroup.Select(innerItem => innerItem.Value)) 
     }); 

然后,当然你也可以更换查询的外部/内部字典,如果它符合您的需求更好。