У меня есть запрос Linq, который получает рейтинги за предыдущие 12 месяцев:Как получить Average сгруппированных результатов в Linq запрос
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 из моего набора данных:
{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: []}
Однако я пытаюсь объединить поле «Рейтинг» в среднее. Я попытался это:
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}
Edit:
Пытались меняется на следующее:
return Json(new
{
Average = ratingsByMonth.Select(x => x.Rating).SelectMany(x => x).Average(),
Dates = ratingsByMonth.Select(x => x.Date.Month)
});
Однако, это только дает мне один «Среднее» значение для всего набора данных, а не среднее значение для даты.
Edit:
Вот выборочные данные:
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)
Существует несоответствие между JSON и то, что вы показываете в LINQ. это Date или GroupCriteria? Также покажите желаемый результат, учитывая данные примера. Я думаю, что вы можете искать SelectMany, а затем Average – Nkosi
Спасибо, обновили – Evonet