使用 LINQ 查询获取所需输出的问题

Issue getting required output using LINQ query

我需要按照这种 json 格式获取数据。

series: [{
    name: 'Marriage',
    data: [1, 2, 3] // Sample Data
}, {
    name: 'Chess',
    data: [2, 2, 3]
}, {
    name: 'Ludo',
    data: [3, 4, 4]
}]

我需要像 http://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/bar-stacked/

中那样创建图表

我尝试过的是根据设备 ID 使用 group by 并使用 for 循环来获取结果。但是我很困在这里获取所需的输出。

这是我到目前为止所尝试过的方法。

void Main()
{
DateTime currentDate = DateTime.UtcNow.Date.AddDays(-30);
var currentMonthData = Device_GameDevices.Where(x => x.CreatedDate >= currentDate).ToList();
// Get total game list
var gamesList = currentMonthData.Select(x => x.GameName).Distinct();

// Group the data as per the device id
var groupedData = from gameData in currentMonthData
                  group gameData by gameData.DeviceID
                  into egroup
                  select new {
                      Game = egroup.Key,
                      Data = from bug in egroup
                               group bug by bug.GameName into g2
                               select new { Name = g2.Key, HoursPlayed = g2.Sum(x => (x.EndTime - x.StartTime).TotalMinutes/60) }
                  };

Console.Write(groupedData);

List<DashboardVM.ChartData> chartDatas = new List<DashboardVM.ChartData>();
List<double> hourResultList = new List<double>();

foreach(var item in groupedData)
{
    var chart = new DashboardVM.ChartData();
    foreach(var gameItem in gamesList)
    {
        chart.GameNameResult = gameItem;
        foreach(var groupedDataItem in item.Data)
        {               
            if(gameItem == groupedDataItem.Name)
            {
                hourResultList.Add(groupedDataItem.HoursPlayed);
            }
            else
            {
                hourResultList.Add(0.0);
            }
        }

        chart.HoursPlayed = hourResultList;
    }

    chartDatas.Add(chart);
}

Console.Write(chartDatas);
}

public class DashboardVM{
 public class ChartData{
    public string GameNameResult{get;set;}
    public List<double> HoursPlayed{get;set;}
 }
 }
public class Chart
{
    public string type { get; set; }
}

public class Title
{
    public string text { get; set; }
}

public class XAxis
{
    public List<string> categories { get; set; } 
}

public class Title2
{
    public string text { get; set; }
}

public class YAxis
{
    public int min { get; set; }
    public Title2 title { get; set; }
}

public class Legend
{
    public bool reversed { get; set; }
}

public class Series
{
    public string stacking { get; set; }
}

public class PlotOptions
{
    public Series series { get; set; }
}

public class Series2
{
    public string name { get; set; }
    public List<double> data { get; set; } 
}

public class RootObject
{
    public Chart chart { get; set; }
    public Title title { get; set; }
    public XAxis xAxis { get; set; }
    public YAxis yAxis { get; set; }
    public Legend legend { get; set; }
    public PlotOptions plotOptions { get; set; }
    public List<Series2> series { get; set; } 
}

void Main()
{
  var Device_GameDevices = new[] {
    new {ID=1,CreatedDate=DateTime.Parse("8/23/2017 06:07:30"),DeviceID="Desktop12",EndTime=DateTime.Parse("8/23/2017 06:06:30"),GameName="CyberGunner",StartTime=DateTime.Parse("8/23/2017 06:03:45")},
    new {ID=2,CreatedDate=DateTime.Parse("8/23/2017 07:14:01"),DeviceID="A12"      ,EndTime=DateTime.Parse("8/23/2017 11:14:01"),GameName="Marriage"   ,StartTime=DateTime.Parse("8/23/2017 07:14:01")},
    new {ID=3,CreatedDate=DateTime.Parse("8/23/2017 07:14:02"),DeviceID="A12"      ,EndTime=DateTime.Parse("8/23/2017 08:14:01"),GameName="Marriage"   ,StartTime=DateTime.Parse("8/23/2017 07:14:02")},
    new {ID=4,CreatedDate=DateTime.Parse("8/23/2017 09:14:01"),DeviceID="A12"      ,EndTime=DateTime.Parse("8/23/2017 09:14:01"),GameName="Chess"      ,StartTime=DateTime.Parse("8/23/2017 07:14:03")},
    new {ID=5,CreatedDate=DateTime.Parse("8/23/2017 07:14:03"),DeviceID="A12"      ,EndTime=DateTime.Parse("8/23/2017 10:14:01"),GameName="Marriage"   ,StartTime=DateTime.Parse("8/23/2017 07:14:03")},
    new {ID=6,CreatedDate=DateTime.Parse("8/23/2017 09:57:28"),DeviceID="B12"      ,EndTime=DateTime.Parse("8/23/2017 10:57:28"),GameName="Marriage"   ,StartTime=DateTime.Parse("8/23/2017 09:57:28")},
  };
  DateTime currentDate=DateTime.UtcNow.Date.AddDays(-30);
  var currentMonthData=Device_GameDevices
    .Where(x=>x.CreatedDate>=currentDate)
    .ToList();

  // Get total game list
  var gamesList=currentMonthData
    .Select(x=>x.GameName)
    .Distinct()
    .ToList();

  var chart=new RootObject
  {
    chart=new Chart{ type="bar"},
    title=new Title{ text="My title" },
    xAxis=new XAxis { categories=gamesList },
    yAxis=new YAxis { min=0, title=new Title2 {text="Total Game Time"}},
    legend=new Legend {reversed=true},
    plotOptions=new PlotOptions { series=new Series {stacking="normal"}},
    series=currentMonthData
      .GroupBy(d=>new {d.DeviceID,d.GameName})
      .Select(d=>new {
        DeviceID=d.Key.DeviceID,
        GameName=d.Key.GameName,
        HoursPlayed=d.Sum(x=>(x.EndTime - x.StartTime).TotalMinutes)/60
      })
      .GroupBy(d=>d.DeviceID)
      .Select(d=>new Series2 {
        name=d.Key,
        data=gamesList
          .GroupJoin(d,a=>a,b=>b.GameName,(a,b)=>new {GameName=a,HoursPlayed=b.Sum(z=>z.HoursPlayed)})
          .OrderBy(x=>gamesList.IndexOf(x.GameName))
          .Select(x=>x.HoursPlayed)
          .ToList()
      }).ToList()
  };
  chart.Dump();
}

这个系列是这样的: