Linq转换或透视行到列

时间:2015-10-22 17:35:03

标签: c# linq

我从查询中返回以下数据:

+-------------------------------------+
| **SUM**                 **Account** |
+-------------------------------------+
| A & E FEE           182396          |
| CM FEE              108569          |
| CONTRACT VALUE      2256044         |
| OVERHEAD            197397          |
+-------------------------------------+   

我需要选择对象属性AeFee,CmFee,ContractValue和Overhead,它们基本上会使属性成为列标题,所以我需要数据看起来像:

+--------+--------+---------------+----------+
| AeFee  | CmFee  | ContractValue | Overhead |
+--------+--------+---------------+----------+
| 182396 | 108569 |       2256044 |   197397 |
+--------+--------+---------------+----------+      

我尝试使用子选择来选择类似这样的东西(伪代码)

Select(s => new
{
   AeFee = Sum if [Account] == "A & E FEE"
}

此链接显示了我尝试使用SQL数据透视图的确切内容。将行转换为列。 SQL Pivot

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我总是喜欢一个答案是聚合的问题。

  var result = data.Aggregate(
    // base object to store
    new { A = 0, CM = 0, CO = 0, O = 0},
    // add in an element
    (a,d) => {
    switch(d.sum) 
      {
         case "A & E FEE": 
           a.A += d.Account;
           break;
         case "CM FEE": 
           a.CM += d.Account;
           break;
           //etc
      }
      return a;
  });

注意你也可以 - 不知道这种方式的d.sum的可能值 - 你需要使用和expando对象。这看起来像这样(没有测试)

  var result = data.Aggregate(
    // base object to store
    new ExpandoObject()
    // add in an element
    (a,d.sum.Replace(" ","_") => {
      a[d.sum.Replace(" ","_")] += d.Account;
      return a;
  });

如果您的和字符串具有在属性标识符中无效的值,则不会起作用。

答案 1 :(得分:0)

这产生了我正在寻找的结果

std::string errs_to_string(Errs::Errs errCode)
{
    static const std::map<Errs::Errs, std::string> errStr {
        { Errs::Errs::ERR_TEST1, "ERR_TEST1" },
        { Errs::Errs::ERR_TEST2, "ERR_TEST2" },
        { Errs::Errs::ERR_TEST3, "ERR_TEST3" }
    };
    return errStr.at(errCode) ;
}