2011-11-25 66 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