2013-02-08 2 views
1

Я пытаюсь заполнить диаграмму данными из моей базы данных. Я использую инфраструктуру Entity и довольно новичок в asp.net.Заполнение градиента высокой четности из запроса linq

Что я пытаюсь сделать, это заполнить диаграмму из моего запроса 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 массива, один массив, содержащий даты и другой массив, содержащий значение 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 запрос в объект, но что бросает мне больше ошибок, чем я знаю, что делать с !!

Любая помощь была бы ДОЛЖНА цениться!

+0

Используете ли вы dotNetHighCharts? –

+0

Если вы используете dll DotNetHighCharts, у меня есть полный пример timeSeriesZoomable, если вы хотите, я могу написать его здесь. Может быть, это показывает вам путь. –

+0

Привет @ AliRızaAdıyahşi, что было бы здорово, я был бы признателен за это! –

ответ

0

Вы используете Highcharts.Net? Если да, то я не уверен, насколько я могу помочь (я только делал это вручную, создавал свои собственные объекты и конвертировал в JSON и т. Д., Которые я нашел, чтобы дать мне полный контроль, хотя и с большим усилием). Во всяком случае, это обычно во многом зависит от того, как должна вести себя ваша ось X ... похоже, что это будут просто дискретные значения даты и времени (не автоматически последовательные), и поэтому ваш массив объектов, вероятно, должен состоять из значений X и Y, а не только значениями Y, как кажется, у вас есть.

Следующая часть действительно зависит от того, как ваша реализация работает, поэтому, пожалуйста, простите за псевдо-псевдо-код ... вам необходимо либо 2D-массив: например: = данные [[1,1], [2, 5], [3,4] ...]

или что-то более конкретное: я использую класс, который имеет свойство X и Y (среди прочего), но, возможно, вы можете попробовать анонимные типы? например, [{x = 1, y = 1}, {x = 2, y = 5}, {x = 3, y = 4} ...] и т.д.

Помогает ли это вообще? Примечания: Вы, вероятно, хотите, чтобы прочитать немного о том, как конвертировать значения даты и время для оси х - я должен был вычислить тики от Эпохи и т.д.

+0

Привет @baldric, да, я использую highcharts.net. Я по-прежнему новичок в развитии, так что немного борюсь. –

3

Chart

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; 
    } 

Chart Data

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

Смежные вопросы