.net 尝试使用linq或其他方式将查询结果透视到对象上

.net 尝试使用linq或其他方式将查询结果透视到对象上,.net,linq,pivot,.net,Linq,Pivot,我有一个返回如下数据的查询: Event | Sum | Date sent | 400 | 1/1/12 open | 200 | 1/1/12 click | 50 | 1/1/12 sent | 300 | 1/8/12 open | 150 | 1/8/12 click | 30 | 1/8/12 SQL查询: select event, sum(thecount), rundate from send_open_click_counts group by event

我有一个返回如下数据的查询:

Event | Sum | Date 
sent  | 400 | 1/1/12 
open  | 200 | 1/1/12
click | 50  | 1/1/12 
sent  | 300 | 1/8/12
open  | 150 | 1/8/12
click | 30  | 1/8/12
SQL查询:

select event, sum(thecount), rundate
from send_open_click_counts
group by event, rundate
order by rundate, event desc 
要将这些值发送到google visualization api以呈现图形,我需要按如下方式排列这些值:

['date' , 'sent' , 'opened' , 'clicked']
['1/1/12', '400' , '200' , '50']
['1/8/12', '300', '150' , '30']
我对这些东西不是很熟悉,但对我来说,这是以日期为轴心的

下面是我用来模拟原始SQL的linq查询

    var dbLinqObj= from r in db.SEND_OPEN_CLICK_COUNTS
                group r by new { r.EVENT, r.RUNDATE } into g
                select new {
                    EVENT = g.Key.EVENT,
                    THECOUNT = g.Sum(r => r.THECOUNT),
                    RUNDATE = g.Key.RUNDATE

                } ;
    dbLinqObj= dbLinqObj.OrderBy(r => r.RUNDATE);
===编辑===找到解决方案=====

在深入研究这个问题并从评论中得到一些建议后,我发现了一个使用LINQ的优雅解决方案

以下是将正确透视结果的LINQ,以便可以轻松地将其转换为JSON字符串

        var query = from q in db.SEND_OPEN_CLICK_COUNTS
                    group q by q.RUNDATE  into g
                    select new
      {
          Date = g.Key,
          Send = g.Where(x => x.EVENT == "sent").Sum(x => x.THECOUNT),
          Open = g.Where(x => x.EVENT == "opened").Sum(x => x.THECOUNT),
          Click = g.Where(x => x.EVENT == "clicked").Sum(x => x.THECOUNT)
      };

您使用的linq pivot通常是如何完成的,您可以尝试使用
Aggregate
linq方法来构建JSON,而不是转换为数组

例如:

var dbLinqObj= from r in db.SEND_OPEN_CLICK_COUNTS
            group r by new { r.EVENT, r.RUNDATE } into g
            select new {
                EVENT = g.Key.EVENT,
                THECOUNT = g.Sum(r => r.THECOUNT),
                RUNDATE = g.Key.RUNDATE

            } ;
var dbLinqObjJSON = dbLinqObj.OrderBy(r => r.RUNDATE).Aggregate((json, x) => json + "['" + x.RUNDATE + ", "'" + x.THECOUNT + "', '" + ...  + "]";
请注意,
Aggregate
不使用StringBuilder,因此对于大型序列,性能会受到影响。这是当前发布的代码中的一个问题,因为您正在使用
String
而不是
StringBuilder
来创建JSON。每次对
字符串使用
+
运算符时,.NET运行时都需要创建一个新字符串

如果您想使其尽可能快,有一个将需要
StringBuilder

var dbLinqObjJSON = dbLinqObj.OrderBy(r => r.RUNDATE).Aggregate(new StringBuilder("['date' , 'sent' , 'opened' , 'clicked'] , "),
                         (json, x) => json.append("['" + x.RUNDATE + "', '" + x.THECOUNT + "', '" + ...  + "], "),
                         (json) => json.ToString());

酷,谢谢!我当然会尝试一下,以帮助更有效地呈现JSON字符串。谢谢你的提示!我找到了数据透视问题的解决方案,我修改了OP以反映这一点。谢谢你的快速回复!