2016-11-29 73 views
2

我有一个LINQ查询,从过去12个月取得的收视率平均:如何获得在Linq查询分组结果

{Date: {Year: 2016, Month: 11}, Rating: [4]} 
{Date: {Year: 2016, Month: 10}, Rating: [5, 5, 4]} 
{Date: {Year: 2016, Month: 9}, Rating: []} 
{Date: {Year: 2016, Month: 8}, Rating: []} 
{Date: {Year: 2016, Month: 7}, Rating: []} 
{Date: {Year: 2016, Month: 6}, Rating: []} 
{Date: {Year: 2016, Month: 5}, Rating: []} 
{Date: {Year: 2016, Month: 4}, Rating: []} 
{Date: {Year: 2016, Month: 3}, Rating: []} 
{Date: {Year: 2016, Month: 2}, Rating: []} 
{Date: {Year: 2016, Month: 1}, Rating: []} 
{Date: {Year: 2015, Month: 12}, Rating: []} 

var ratingsByMonth = 
    from month in Enumerable.Range(0, 12) 
    let key = new { Year = DateTime.Now.AddMonths(-month).Year, Month = DateTime.Now.AddMonths(-month).Month } 
    join groupedRating in ratings on key 
      equals new 
      { 
       groupedRating.RatingDate.Year, 
       groupedRating.RatingDate.Month 
      } into g 
    select new { 
     Date = key, 
     Rating = g.Select(x=>x.Rating) 
    }; 

ratingsByMonth从我的数据集中返回以下JSON

但是,我试图将评分字段汇总为平均值。我已经试过这样:

return Json(new 
{ 
    Average = ratingsByMonth.Average(x=>x.Rating), 
    Dates = ratingsByMonth.Select(x => Date) 
}); 

,但我得到的平均强调了以下错误 - 行:

无法隐式转换类型 “System.Collections.Generic.IEnumerable”到“长? “

,我寻找的输出是:

{Date: {Year: 2016, Month: 11}, Rating: 4} 
{Date: {Year: 2016, Month: 10}, Rating: 3.5} 
{Date: {Year: 2016, Month: 9}, Rating: 0} 
{Date: {Year: 2016, Month: 8}, Rating: 0} 
{Date: {Year: 2016, Month: 7}, Rating: 0} 
{Date: {Year: 2016, Month: 6}, Rating: 0} 
{Date: {Year: 2016, Month: 5}, Rating: 0} 
{Date: {Year: 2016, Month: 4}, Rating: 0} 
{Date: {Year: 2016, Month: 3}, Rating: 0} 
{Date: {Year: 2016, Month: 2}, Rating: 0} 
{Date: {Year: 2016, Month: 1}, Rating: 0} 
{Date: {Year: 2015, Month: 12}, Rating: 0} 

编辑:

试图改变以下几点:

return Json(new 
{ 
    Average = ratingsByMonth.Select(x => x.Rating).SelectMany(x => x).Average(), 
    Dates = ratingsByMonth.Select(x => x.Date.Month) 
}); 

然而,这只是给了我一个整个数据集的“平均”值,而不是每个日期的平均值。

编辑:

下面是示例数据:

RatingID Rating RatingDate 
5   5 2016-10-09 20:11:29.590 
11   0 2016-10-09 20:14:42.503 
21   5 2016-10-09 20:24:15.667 
60   4 2016-10-28 11:01:21.220 
64   4 2016-11-03 16:30:47.657 

所以对于十一月平均应该是4,和十月应该是3.5(5 + 0 + 5 + 4/4)

+0

还有就是JSON和您在LINQ显示什么之间的不匹配。是Date还是GroupCriteria?给出示例数据同时显示所需的输出。我认为你可能正在寻找一个SelectMany,然后平均 – Nkosi

+0

谢谢,已更新 – Evonet

回答

1

在原始查询中,您可能想要这样做。

//other code removed for brevity 
select new { 
    Date = key, 
    Rating = g.Count() > 0 ? g.Average(x => x.Rating) : 0 
}; 

,然后返回结果

return Json(ratingsByMonth); 
+0

试过这个,但是每次我运行一个Average()这个时候,我得到的Sequence就不包含任何元素。已尝试添加.Where(x = x.Rating!= 0) – Evonet

+0

好的。我可以看到一小部分收视率数据样本 – Nkosi

+0

我用样本数据更新了这个问题 – Evonet

0

这里的问题是属性评级本身就是一个序列,而不是一个离散的值,你可以要求平均方法来考虑。

这听起来像你实际上想要做的事情一样:将所有评分集合平铺成单个序列,然后取所有结果值的平均值。

喜欢的东西:

var avg = ratingsByMonth.Select(x => x.Rating).SelectMany(x => x).Average() 

它使用选择产生评级阵列序列。 SelectMany然后平整列表,之后您可以取平均值。

+0

感谢您的期待,更新了我的问题与结果,并不完全是我之后。 :-) – Evonet