#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)
});