2016-11-29 3 views
2

У меня есть запрос 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)

+0

Существует несоответствие между JSON и то, что вы показываете в LINQ. это Date или GroupCriteria? Также покажите желаемый результат, учитывая данные примера. Я думаю, что вы можете искать SelectMany, а затем Average – 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

Попробовали это, но каждый раз, когда я запускаю Средство() в этот момент, я получаю, что Sequence не содержит элементов.Попробовали добавить. Где (x = x.Rating! = 0) – Evonet

+0

Хорошо. Могу ли я увидеть небольшой пример данных рейтингов – Nkosi

+0

Я обновил вопрос с примерами данных – Evonet

0

Проблема здесь в том, что свойство Rating - это сама последовательность, а не дискретное значение, которое вы можете задать среднему методу.

Похоже, вы действительно хотите сделать что-то вроде: сгладить все коллекции рейтингов в одну последовательность, а затем взять среднее значение по всем результирующим значениям.

Что-то вроде:

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

Это использует Выбрать для создания последовательности рейтинговых массивов. SelectMany затем выравнивает список, после чего вы можете взять среднее значение.

+0

Спасибо, что посмотрели, обновили мой вопрос с результатами, не совсем то, чем я был. :-) – Evonet

Смежные вопросы