首页 文章

LINQ将数据分组并返回图表系列

提问于
浏览
0

假设我们有一个简化的 Orders 实体,具有以下属性:Id(int,PK),orderDate(datetime,not null)和productCategory(string,not null) .

什么是 LINQ to Entities 查询,它返回按月,按月分组的每个类别的订单数量,按年份,按月排序?

输出应如下所示,以便使用 JQuery.getJSON() 将其作为Highcharts折线图的系列传递:

[{
   name: 'Dairy',
   data: [23, 27, 32, 44, 21, 30, 11, 0, 9, 24, 3, 19]
 },
 {
   name: 'Frozen',
   data: [11, 4, 0, 6, 8, 10, 17, 24, 18, 8, 23, 10]
}]

也就是说,每个类别有12个值,包括零 .

2 回答

  • 1
    var months = Enumerable.Range(1, 12);
     var max = DateTime.Now.AddYears(-1);
     var result = data.Where(d => d.OrderDate >= max)
                    .GroupBy(d => d.ProductCategory)
                    .Select(g =>
                            new
                            {
                                Name = g.Key,
                                Data =( 
                                from m in months
                                join  d in
                                    g.OrderBy(gg => gg.OrderDate.Year)
                                    .ThenBy(gg => gg.OrderDate.Month)
                                    .GroupBy(gg => gg.OrderDate.Month)
                                    on m equals d.Key into gj
                                    from j in gj.DefaultIfEmpty()
                                        select j.Key != null ? j.Count() : 0)
                            }).ToArray();
    
  • 0

    这似乎有效:

    var orders = from o in orderList.ToList().Where(x => x.orderDate >= DateTime.Now.AddYears(-1)).GroupBy(x => x.productCategory)
            select new {
                name = o.Key,
                data = ((Func<int[]>)(() => {
                    var months = new int[12];        
                    for (int i = 0; i < 12; i++) {
                        months[i] = o.Where(x => x.productCategory == o.Key && x.orderDate.Month == i).Count();
                    }
                    return months;
                }))()
            };
    

    首先,我们过滤去年任何日期的订单 . 然后我们按 productCategory 字段对结果进行分组 . 从这个分组中,我们创建了一个匿名投影类 . 这里我们将 name 字段设置为等于分组键(类别) . 为了填写 data 字段,我们使用匿名函数枚举每个月,并计算与我们分组的月份数和产品类别相匹配的每条记录 .

    这允许我们将0个计数放在我们没有数据的月份 .

相关问题