0

我有一个 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))
}]
4

1 回答 1

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();

注意:排序没有意义,然后过滤相同的数据。最好先过滤,然后订购更少的数据。

于 2013-02-21T14:58:47.680 回答