1

データベースのデータをチャートに入力しようとしています。私は Entity フレームワークを使用しており、asp.net にはかなり慣れていません。

私がやろうとしているのは、linq クエリからグラフを作成することです。

 var totals = from s in db.ClassInstanceDetails.Include("ClassInstance")
                 where s.ClassInstance.ClassID == 2
                    group s by s.ClassInstance.Date into grouped
                    select new
                    {
                        CIDate = grouped.Key,
                        TotalStudentsInClass = grouped.Count(s => s.Attendance)
                    };

linq クエリは正常に機能し、classinstance 内のすべての学生をカウントし、それらをグループ化してカウントします。私の問題は、データを抽出してチャートに入れる方法です。デバッグすると、合計変数が

{System.Data.Objects.ObjectQuery<<>f__AnonymousType0<System.DateTime,int>>}

そして、合計によって保持される結果ビューを次のように見ることができます:

{CIDate = {04/09/2012}, TotalStudentsInClass = 5}
{CIDate = {05/09/2012}, TotalStudentsInClass = 7}
{CIDate = {06/09/2012}, TotalStudentsInClass = 14}

クエリが機能するので、これは素晴らしいことです。特定のクラスのインスタンスに何人の生徒が出席したかがわかります。ハイチャートを使用して、このデータを折れ線グラフに入れようとしています。linq の結果を 2 つの配列に分けようとしました。1 つは日付を含む配列で、もう 1 つは TotalStudentsInClass 値を含む配列ですが、タイプが異なるため運がありませんか??? これはこれを行う正しい方法ですか?

私がオンラインで見つけた例は、私が思う配列から引っ張っています

.SetSeries(new[]
                       {
                           new Series { Name = "Tokyo", Data = new Data(ChartsData.TokioData) },
                           new Series { Name = "New York", Data = new Data(ChartsData.NewYorkData) },
                           new Series { Name = "Berlin", Data = new Data(ChartsData.BerlinData) },
                           new Series { Name = "London", Data = new Data(ChartsData.LondonData) }
                       }

オブジェクトからのデータで、

public static object[] TokioData = new object[] { 7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6 };

linq クエリをオブジェクトに実行しようとしましたが、どうすればよいか分からないほど多くのエラーがスローされます!!

どんな助けでも大歓迎です!!

4

2 に答える 2

3

チャート

public static Highcharts TimeSeriesZoomable(Series[] Series, Number MinRange, Number PointInterval, DateTime PointStartDate, AxisTypes XAxisType = AxisTypes.Datetime, string Title = "", string SubTitle = "", string XAxisTitle = "", string YAxisTitle = "", string ToolTipFormat = "", string YAxisLabel = "")
    {
        Highcharts chart = new Highcharts("chart")
            .SetOptions(new GlobalOptions { Global = new Global { UseUTC = false } })
            .InitChart(new Chart { ZoomType = ZoomTypes.X, SpacingRight = 20, DefaultSeriesType = ChartTypes.Area, Height = 300, BorderRadius = 0 })
            .SetTitle(new Title { Text = Title })
            .SetSubtitle(new Subtitle { Text = SubTitle })
            .SetXAxis(new XAxis
            {
                Type = XAxisType,
                MinRange = MinRange,
                Title = new XAxisTitle { Text = XAxisTitle }
            })
            .SetYAxis(new YAxis
            {
                Title = new YAxisTitle { Text = YAxisTitle },
                Min = 0.6,
                StartOnTick = false,
                EndOnTick = false,
                Labels = new YAxisLabels
                {
                    Formatter = @"function() { return this.value +' " + YAxisLabel + "';}"
                }
            })
            .SetTooltip(new Tooltip { Shared = true/*, Formatter = @"function() { return ''+ this.x +' - '+ this.y +' " + ToolTipFormat + "'; }" */})
            .SetLegend(new Legend { Enabled = true, VerticalAlign = VerticalAligns.Top })
            .SetPlotOptions(new PlotOptions
            {
                Line = new PlotOptionsLine
                {
                    LineWidth = 3,
                    Marker = new PlotOptionsLineMarker
                    {
                        Enabled = false,
                        States = new PlotOptionsLineMarkerStates
                        {
                            Hover = new PlotOptionsLineMarkerStatesHover
                            {
                                Enabled = true,
                                Radius = 5
                            }
                        }
                    },
                    Shadow = false,
                    States = new PlotOptionsLineStates { Hover = new PlotOptionsLineStatesHover { LineWidth = 3 } },
                    PointInterval = PointInterval,
                    PointStart = new PointStart(PointStartDate)
                },
                Spline = new PlotOptionsSpline
                {
                    LineWidth = 3,
                    Marker = new PlotOptionsSplineMarker
                    {
                        Enabled = false,
                        States = new PlotOptionsSplineMarkerStates
                        {
                            Hover = new PlotOptionsSplineMarkerStatesHover
                            {
                                Enabled = true,
                                Radius = 5
                            }
                        }
                    },
                    Shadow = false,
                    States = new PlotOptionsSplineStates { Hover = new PlotOptionsSplineStatesHover { LineWidth = 3 } },
                    PointInterval = PointInterval,
                    PointStart = new PointStart(PointStartDate)
                },
                Area = new PlotOptionsArea
                {
                    //FillColor = new BackColorOrGradient(new Gradient
                    //{
                    //    LinearGradient = new[] { 0, 0, 0, 300 },
                    //    Stops = new object[,] { { 0, "rgb(116, 116, 116)" }, { 1, Color.Gold } }
                    //}),
                    LineWidth = 1,
                    Marker = new PlotOptionsAreaMarker
                    {
                        Enabled = false,
                        States = new PlotOptionsAreaMarkerStates
                        {
                            Hover = new PlotOptionsAreaMarkerStatesHover
                            {
                                Enabled = true,
                                Radius = 5
                            }
                        }
                    },
                    Shadow = false,
                    States = new PlotOptionsAreaStates { Hover = new PlotOptionsAreaStatesHover { LineWidth = 1 } },
                    PointInterval = PointInterval,
                    PointStart = new PointStart(PointStartDate)
                }
            })
            .SetSeries(Series);
        return chart;
    }

チャートデータ

public static Series GetTimeSeriesData(IQueryable<YourModel> model, ChartTypes ChartType)
    {
        List<Series> Series = new List<Series>();

        var chartSeries = model.GroupBy(x => x.Name)
                        .Select(g => new
                        {
                            Name = g.Key,
                            Data = g.Select(x => x.Value).ToArray()
                        }).ToArray();

        foreach (var item in chartSeries)
        {
            object[] data = item.Data.Cast<object>().ToArray();
            Series localSeries = new Series { Name = item.Name, Data = new Data(data), Type = ChartType };
            Series.Add(localSeries);
        }

        return Series;
    }

使用法

IQueryable<YourModel> model;
ChartData chartData = new ChartData();
Highcharts chart = new HighChart("chart_time_series");

try
{
    model = db.ClassInstanceDetails.AsQueryable();
    chartData = GetTimeSeriesData(model, ChartTypes.Line);
    chart = TimeSeriesZoomable(chartData.ToArray(), another_options);
}
catch (Exception e)
{
}

チャートの完全な例: http://dotnethighcharts.codeplex.com/releases/view/85324

于 2013-02-08T21:30:04.383 に答える
0

Highcharts.Netを使用していますか?もしそうなら、私はどれだけの助けができるかわかりません(私は手動でそれを行い、独自のオブジェクトを作成し、JSONに変換するなど、より多くの努力を払って完全に制御できることがわかりました)とにかく、これは通常X軸の動作に大きく依存します...それは(自動的に連続するのではなく)個別の日時値であるように見えるため、オブジェクト配列はおそらくX値とY値で構成する必要があります。 Y値だけでなく、そこにあるように見えます。

この次の部分は、実際には実装がどのように機能するかに依存するため、疑似擬似コードを許してください... 2D配列が必要です。例:data = [[1,1]、[2,5]、[3、 4] ...]

またはもっと具体的なもの:私は(とりわけ)XプロパティとYプロパティを持つクラスを使用していますが、おそらく匿名型を試すことができますか?例:[{x = 1、y = 1}、{x = 2、y = 5}、{x = 3、y =4}...]など

これはまったく役に立ちますか?注:x軸の日時値を変換する方法について少し読んでおくとよいでしょう-エポックなどからティックを計算する必要がありました

于 2013-02-08T13:06:10.670 に答える