LINQ查询对象数组

时间:2013-02-21 14:25:48

标签: linq highcharts

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

1 个答案:

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

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