.NET Linq to SQL: выберите среднее с предложением where - PullRequest
1 голос
/ 12 августа 2010

У меня есть таблица с фильмами, у которой есть целочисленный атрибут, называемый ранжированием. Теперь я хотел бы получить средний рейтинг по всем фильмам, содержащим определенного актера.

Dim q2 = (Из p в dc.Movies Где p.actlist.Contains (actor.name) Выберите p.ranking) .Average ()

Этот запрос не работает - не удалось разрешить перегрузку, потому что ни один доступный «Средний» не принимает это количество аргументов. Без условия Where это работает нормально.

Как объединить функцию Average с предложением Where? Я не смог найти ни одного полезного примера в MSDN и Интернете ..

Ответы [ 3 ]

0 голосов
/ 12 августа 2010

Можете ли вы попробовать следующий код:

Dim avgRanking = (From m in dc.Movies _
                  Where m.actlist.Contains(actor.Name) _
                  Select m.ranking).Average(Function(a) Convert.ToInt32(a))

И это также должно работать:

Dim avgRanking = (From m in dc.Movies _
                  Where m.actlist.Contains(actor.Name) _
                  Select CInt(m.ranking)).Average()

Проблема типа Movie.ranking.Результат вашего запроса и IEnumerable из tinyint.Для этого нет перегрузки Average.

0 голосов
/ 12 августа 2010

Я разобрался сам:

Dim q3 = (Из In In dc.Movies, где a.actlist.Contains (actor.name) Выберите a) .Average (Function (r) r.рейтинг)

Но этот бросает исключение, если актера нет ни в одном фильме.Поэтому я должен был поставить его в try..cast.

0 голосов
/ 12 августа 2010

Возможно, нет результатов, поэтому он не может дать среднее значение; попробовать

Dim q2 = (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p.ranking).Count() == 0 ? 0 : (From p In dc.Movies Where p.actlist.Contains(actor.name) Select p.ranking).Average();
...