C# 对数据进行分组并返回图表序列的LINQ
假设我们有一个简化的Orders实体,具有以下属性:Id(int,PK)、orderDate(datetime,非null)和productCategory(string,非null) 什么是LINQ to Entities查询,它返回过去12个月内按月份分组的每个类别的订单数,按年份、月份排序 输出应该如下所示,以便使用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
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();