我有一个Linq查询从数据库中获取一组日期和值,我需要能够使用JSON将其推送到HighCharts图表。
我一直用于我常用的linqy的查询是:
var data = _db.CampaignValues.GroupBy(t => t.ValueDate)
.Select(g => new GraphValue() { T = g.Key, V = g.Sum(t => t.MessageCount) })
.OrderBy(g => g.T)
.Where(g => g.T > start)
.ToArray()
;
对于背景,我试图将数据拉入HighCharts“具有不规则间隔的时间数据”图表。其示例中给出的数据格式为:
data: [
[Date.UTC(1970, 9, 27), 0 ],
[Date.UTC(1970, 10, 10), 0.6 ],
[Date.UTC(1970, 10, 18), 0.7 ],
[Date.UTC(1970, 11, 2), 0.8 ]
]
我的问题是我似乎无法将其转换为JSON格式以匹配上述内容。我要么得到引用的值,要么得到错误布局的数组。
我在视图中尝试过使用JsonConvert,但是现在我受限于我对JS和Linq的了解。
@model IQueryable<GatorWatch.Web.Controllers.GraphValue>
@{
var data = JsonConvert.SerializeObject(Model.ToList());
}
<script type="text/javascript">
var chart1;
$(document).ready(function() {
chart1 = new Highcharts.Chart({
//snip
series: [{
type: 'line',
name: 'Messages',
data: [@Html.Raw(data)]
}]
});
});
<script type="text/javascript">
但是这会创建一个这样的字符串:
data: [[
{"T":"2013-01-02T00:00:00","V":684112},
{"T":"2013-01-03T00:00:00","V":524172},
{"T":"2013-01-04T00:00:00","V":769807},
{"T":"2013-01-05T00:00:00","V":25076}
]]
另一种方法是使用DotNet.Highcharts库。库提供的示例是数据格式为:
var data = new object[,]
{
{new DateTime(1970, 9, 27), 0},
{new DateTime(1970, 10, 10), 0.6},
{new DateTime(1970, 10, 18), 0.7},
{new DateTime(1970, 11, 2), 0.8},
}
这是解决方案,我得到了Alex的回答。
在控制器中:
private static long ToJavaScriptMilliseconds(DateTime dt)
{
long datetimeMinTimeTicks = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks;
return (long)((dt.ToUniversalTime().Ticks - datetimeMinTimeTicks) / 10000);
}
public ActionResult Index()
{
var v1 = _db.CampaignValues.GroupBy(t => t.ValueDate)
.Select(g => new GraphValue() { T = g.Key, V = g.Sum(t => t.MessageCount) })
.Where(g => g.T > start)
.OrderBy(g => g.T)
.AsEnumerable()
.Select(g => new object[] { ToJavaScriptMilliseconds(g.T), g.V })
.ToArray()
;
return View(v1);
}
然后在视图中:
@model object[][]
// snip
series: [{
type: 'line',
name: 'Messages',
data: @Html.Raw(JsonConvert.SerializeObject(Model))
}]
答案 0 :(得分:0)
将您的GraphValue
投影到一个对象数组中:
var data = _db.CampaignValues.GroupBy(t => t.ValueDate)
.GroupBy(t => t.ValueDate)
.Select(g => new GraphValue() { T = g.Key, V = g.Sum(t => t.MessageCount) })
.Where(g => g.T > start)
.OrderBy(g => g.T)
.Select(g => new object[] { g.T, g.V })
.ToArray();
注意:订购时没有任何意义,然后过滤相同的数据。最好先过滤,然后订购更少的数据。