[英]Get top 5 records based on average c# linq lazy loading
我正在尝试根据电影的平均评分获得前 5 名记录。
我有以下,
电影.Cs
public class Movie
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public string YearOfRelease { get; set; }
public int RunningTime { get; set; }
public virtual ICollection<MovieGenre> MovieGenres { get; set; }
public virtual ICollection<MovieRating> MovieRatings { get; set; }
}
MovieRating.cs
public class MovieRating
{
[Key]
public int Id { get; set; }
public virtual Movie Movie { get; set; }
public virtual AppUser AppUser { get; set; }
public int Rating { get; set; }
}
var queryable = await _context.MovieRatings.AverageAsync(x => x.Rating);
这给了我整个 MovieRatings 表的平均值。 我想要得到的是 linq 相当于这个 SQL 查询
select top 5 MovieId, avg(Rating) as AverageRating
from MovieRatings
group by MovieId
order by AverageRating desc
任何帮助将不胜感激。 谢谢
看起来你想要 select Movie
实体,所以你可以在OrderByDescending
方法中取平均评分:
var query = _context.Movies
.OrderByDescending(m => m.MovieRatings.Average(r => r.Rating))
.Take(5);
但是,对于 SQL,您希望:
MovieId
MovieId
和Average rating
此查询将复制您的 SQL:
var queryable = _context.MovieRatings
.GroupBy(m => m.Id)
.Select(g => new { MovieId = g.Key, AverageRating = g.Average(s => s.Rating)})
.OrderByDescending(m => m.AverageRating)
.Take(5);
var queryable = await _context.MovieRatings.OrderByDescending(x => x.Rating).Take(5);
如果“OrderByDescending()”不可用,首先转换为 List<>:
var movieList = await _context.MovieRatings.ToList();
var result = movieList.OrderByDescending(x => x.Rating).Take(5);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.