.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以反映这一点。谢谢你的快速回复!