2011-11-25 93 views
1

我正在嘗試使用Linq來旋轉數據表。通過這裏的回覆以及其他一些消息來源,我認爲我已經設法實現了這個目標,但是我在完成查詢時遇到了一些麻煩(完全是因爲我對Linq缺乏瞭解,但是我目前時間緊迫)。數據表如下:更多Linq數據透視

來源:

Name  |ItemCode|Rank 
----------------------------  
    -1  |blah1 |1 
    -1  |blah2 |2 
    -1  |blah3 |3 
    -1  |blah4 |4 
*PLACEHOLDER*|blah2 |7 
*PLACEHOLDER*|blah1 |22 

所需的輸出:

ItemCode |companyWide|myGroup 
----------------------------  
    blah1  |1   |22 
    blah2  |2   |7 
    blah3  |3   | 
    blah4  |4   | 

我的代碼目前是:

var temp = reportDataTable.AsEnumerable() 
          .GroupBy(a => a["ItemCode"]).Select(b => new{ItemCode = b.Key, 
                     companyWide = b.Where(a => (string)a["Name"] == "-1").Select(a => a["Rank"]), 
                     myGroup = b.Where(a => (string)a["Name"] == "*PLACEHOLDER*").Select(a => a["Rank"]) }) ; 

通過ItemCode分組工作,但我猜我填寫其他2欄時我的語法是錯誤的。任何幫助,這將不勝感激。

+0

通過加入'參考System.Data.DataSetExtensions.dll'你可以使用'Field'方法來訪問,而不是訴諸強類型值通過索引器投射和返回'object'類型。例如,'a.Field (「ItemCode」)'將返回一個'字符串'和'a.Field (「Rank」)'將返回一個'int'。使用'int?'返回一個可爲空的整數。 –

回答

1

新增FirstOrDefault()項:

var temp = reportDataTable.AsEnumerable().GroupBy(a => a["ItemCode"]).Select(b => 
    new{ItemCode = b.Key, 
     companyWide = b.Where(a => (string)a["Name"] == "-1").Select(a =>a["Rank"]).FirstOrDefault(), 
     myGroup = b.Where(a => (string)a["Name"] == "*PLACEHOLDER*").Select(a => a["Rank"]).FirstOrDefault() }) ; 
+0

+1我在回覆中錯過了這個明顯的解決方案。 –

+0

+1謝謝,這是我一直在尋找的解決方案。 (如果我可以的話,我會投票!) – Sufo