2013-02-21 80 views
0

我有一個Linq查詢從數據庫中獲取一組日期和值,我需要能夠使用JSON將其推送到HighCharts圖表中。對一個對象數組的LINQ查詢

我一直在使用我平時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「時間數據隨着Inrregular週期」表。在他們的例子給出的數據格式爲:

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)) 
}] 
+5

問題是..? – 2013-02-21 14:28:22

+3

Gah,對不起,這是發佈問題時發生的問題,同時詢問工作中的其他問題。我會用我已經嘗試過的東西來更新這個問題的諷刺。對不起 – Cylindric 2013-02-21 14:38:10

回答

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

的說明:是沒有意義在排序中,然後過濾相同的數據。最好先過濾,然後再訂購更少的數據。

+0

這就是我想的。我現在需要做的就是如何從DateTime獲取JavaScript時間,但我認爲Google會幫助我。 – Cylindric 2013-02-21 15:44:18

+0

你可以使用var time = new Date() – 2013-02-27 14:36:36