我有一个 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},
}
这是我在亚历克斯回答的帮助下提出的解决方案。
在控制器中:
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))
}]