2016-07-28 81 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)) 
     }); 

然後,當然你也可以更換查詢的外部/內部字典,如果它符合您的需求更好。