C# 对数据进行分组并返回图表序列的LINQ

C# 对数据进行分组并返回图表序列的LINQ,c#,json,linq,highcharts,linq-to-entities,C#,Json,Linq,Highcharts,Linq To Entities,假设我们有一个简化的Orders实体,具有以下属性:Id(int,PK)、orderDate(datetime,非null)和productCategory(string,非null) 什么是LINQ to Entities查询,它返回过去12个月内按月份分组的每个类别的订单数,按年份、月份排序 输出应该如下所示,以便使用JQuery.getJSON(),将其作为系列传递给Highcharts折线图: 也就是说,每个类别有12个值,包括零。这似乎有效: var orders = from o i

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

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

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

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

这似乎有效:

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;
            }))()
        };
var orders=from o in orderList.ToList().Where(x=>x.orderDate>=DateTime.Now.AddYears(-1)).GroupBy(x=>x.productCategory)
选择新的{
名称=o.键,
数据=((Func)(()=>{
var月数=新整数[12];
对于(int i=0;i<12;i++){
月份[i]=o.Where(x=>x.productCategory==o.Key&&x.orderDate.Month==i.Count();
}
返回月份;
}))()
};
首先,我们过滤订单中日期在去年的任何内容。然后,我们按照productCategory字段对结果进行分组。从这个分组中,我们创建一个匿名投影类。在这里,我们将名称字段设置为分组键(类别)。为了填充数据字段,我们使用一个匿名函数来枚举每个月,并统计与我们分组所依据的月数和产品类别匹配的每个记录


这使我们可以在没有数据的月份中输入0个计数。

谢谢您的编辑,Yuval,我不知道如何对代码执行此操作。它几乎可以工作,除了3件事:LINQ to Entities不接受
DateTime.Now.AddYears()
。我改用了
EntityFunctions.AddYears(DateTime.Today,-1))
ToArray()
在该上下文中无效,我在
query.Execute()
之后将其提取出来,最后,我唯一无法修复的是,如果当月没有订单,它不会返回0。您可以在之前执行DateTime.Now.AddYears()并使用该变量。稍后我会更新0 for no orders的答案,基本上你可以使用月数组[1-12]进行左连接,并在清空库存时添加0作为计数,我对此表示感谢。非常感谢AD.Net。不幸的是,引发了此错误:
无法创建“匿名类型”类型的常量值。在此上下文中只支持基元类型或枚举类型。
这里描述了一个可能的原因:现在检查它,几个月来确实不需要创建匿名类型,我只是在测试不同的东西。现在应该没事了。嗨,ohlando,谢谢你。我收到错误:
带有语句体的lambda表达式无法在
((Func)(
)之后转换为表达式树。
。有什么建议吗?我相信您遇到了问题,因为您的集合不是IEnumerable。我已更新了答案,以防您有兴趣在执行查询之前转换它。
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;
            }))()
        };
 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();