Во-первых, кажется, что ваши модели имеют больше агрегации, чем требовалось, я позволил себе обрезать его и убрать лишние поля, в идеале все, что вам нужно для связи между двумя моделями RestaurantId
(Первичный ключ для Restaurant
и ИностранныйКлюч (1: N) для Review
)
public class Restaurant
{
public int RestaurantId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public virtual ICollection<Review> Reviews { get; set; }
}
public class Review
{
public int ReviewId { get; set; }
public double Rating { get; set; }
public int RestaurantId { get; set; }
public DateTime DateOfReview { get; set; }
}
Если это модели, то вам просто нужно List<Restaurant> restaurantList
, поскольку это внутренне содержит коллекцию рецензий, тогда всевам нужно:
var result =
restaurantList.Select(x => new {
Name = x.Name,
Average = x.Reviews.Average(y => y.Rating)
}
);
В случае, если агрегации коллекции нет, и у вас есть отдельный ReviewList следующим образом: List<Review> reviewList
, затем выполните следующие действия:
var result =
reviewList.GroupBy(x => x.RestaurantId, x => new {x.RestaurantId,x.Rating})
.Join(restaurantList, x => x.Key,y => y.RestaurantId,(x,y) => new {
Name = y.Name,
AvgRating = x.Average(s => s.Rating)
});
Также обратите вниманиеэто будет только список ресторанов, которые имеют по крайней мере один отзыв, так как мы используем InnerJoin
, в противном случае вам нужно LeftOuterJoin
, используя GroupJoin
, для ресторанов с 0 рейтингом