Linq查询将数据转换为时间序列

时间:2018-07-08 12:20:42

标签: c# asp.net linq asp.net-core

我有以下数据:

10/6/2018 - Category 1
11/6/2018 - Category 1
12/6/2018 - Category 2
13/6/2018 - Category 1
15/6/2018 - Category 3
20/7/2018 - Category 1
21/7/2018 - Category 1
4/8/2018 - Category 4
5/8/2018 - Category 2

我正在尝试在点网核心中使用linq,以获得可以绘制的json结果。我正在尝试制作一个按月对计数进行分组的图形。

结果应如下所示(类别是动态的,我无法对其进行硬编码):

series: [{
  name: 'Category 1',
  data: [3, 2, 0]
}, {
  name: 'Category 2',
  data: [1, 0, 1]
}, {
  name: 'Category 3',
  data: [1, 0, 0]
}, {
  name: 'Category 4',
  data: [0, 0, 1]
}]

我不确定从哪里开始,如何用linq在点网核心中做到这一点

根据评论进行编辑:

首先,数据来自数据库,因此它是动态的。其次,结果就是我想要的输出结果,即类别1在6月有2个项目,在7月有2个项目,在8月有0个项目(如果不清楚,我使用DD / MM / YYYY)

1 个答案:

答案 0 :(得分:0)

您可以使用NewtonSoft.Json将其作为JSON获取:

void Main()
{
    var myData = new List<MyClass> {
        new MyClass {Date=new DateTime(2018,6,10),Category="Category 1"},
        new MyClass {Date=new DateTime(2018,6,11),Category="Category 1"},
        new MyClass {Date=new DateTime(2018,6,12),Category="Category 2"},
        new MyClass {Date=new DateTime(2018,6,13),Category="Category 1"},
        new MyClass {Date=new DateTime(2018,6,15),Category="Category 3"},
        new MyClass {Date=new DateTime(2018,7,20),Category="Category 1"},
        new MyClass {Date=new DateTime(2018,7,21),Category="Category 1"},
        new MyClass {Date=new DateTime(2018,8,4),Category="Category 4"},
        new MyClass {Date=new DateTime(2018,8,5),Category="Category 2"},
    };


    var result = from c in myData.Select(d => d.Category).Distinct()
                 let months = myData.Select(d => d.Date.Month).Distinct().OrderBy(d => d).ToArray()
                 let m1 = months[0]
                 let m2 = months[1]
                 let m3 = months[2]
                 select new {
                     name = c,
                     data = new int[] {
                        myData.Count(d => d.Category == c && d.Date.Month==m1),
                        myData.Count(d => d.Category == c && d.Date.Month==m2),
                        myData.Count(d => d.Category == c && d.Date.Month==m3),
                     }
                 };

    var json = JsonConvert.SerializeObject(result, Newtonsoft.Json.Formatting.Indented);
    Console.WriteLine(@"""series"": " + json);
}

public class MyClass
{
    public DateTime Date { get; set; }
    public string Category { get; set; }
}