Расчет среднего значения в linq

#c# #linq

Вопрос:

Я хочу получить среднюю оценку каждой книги. Проблема в том, что я не знаю, как это сделать в linq.

Код:

  public class Review
{
    public int Id { get; set; }
    public string Content { get; set; }
    public int Rating { get; set; }
    public virtual Book Book { get; set; }
}

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Review> Reviews { get; set; }
}
 

В sql это выглядело бы так:

 select Books.Title, Avg(Reviews.Rating)
from Books
  inner join Reviews on Books.Id = Reviews.BookId
group by Books.Title
 

Выходной пример:

 Title | Rating
Book1 | 5
Book2 | 2
Book3 | 3
 

Как я могу выполнить этот запрос в linq c #?

Комментарии:

1. Содержит ли Reviews DTO внутри Book DTO все отзывы, связанные с одной и той же книгой?

2. @PrasadTelkikar, К сожалению, нет

Ответ №1:

Если Reviews свойство содержит все Review s для конкретного Book , это просто:

 var result = books.Select(book => new
{
    book.Title,
    Rating = book.Reviews.Average(review => review.Rating)
});
 

Но если у вас есть отдельные коллекции, вам нужно будет выполнить объединение:

 var result = books.GroupJoin(reviews, // One-to-many        
    book => book.Id,                  // Primary key
    review => review.Book.Id,         // Foreign key
    (book, reviews) => new            // Selection
    {
        book.Title,
        Rating = reviews.Average(review => review.Rating)
    });