根据平均c#linq延迟加载获得前5项记录
我想根据这部电影的平均收视率来获得前五名 我有以下几点, 电影公司根据平均c#linq延迟加载获得前5项记录,c#,entity-framework,linq,lazy-loading,C#,Entity Framework,Linq,Lazy Loading,我想根据这部电影的平均收视率来获得前五名 我有以下几点, 电影公司 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 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; }
}
这是整个电影表的平均值。我想要得到的是这个SQL查询的linq等价物
select top 5 MovieId, avg(Rating) as AverageRating
from MovieRatings
group by MovieId
order by AverageRating desc
任何帮助都将不胜感激。谢谢看起来您想要选择
电影
实体,因此您可以在OrderByDescending
方法中取评分的平均值:
var query = _context.Movies
.OrderByDescending(m => m.MovieRatings.Average(r => r.Rating))
.Take(5);
但是,对于要执行以下操作的SQL:
MovieId
MovieId
和Average rating
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);
看起来您想要选择
电影
实体,因此您可以在OrderByDescending
方法中取评分的平均值:
var query = _context.Movies
.OrderByDescending(m => m.MovieRatings.Average(r => r.Rating))
.Take(5);
但是,对于要执行以下操作的SQL:
MovieId
MovieId
和Average rating
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);
如果“OrderByDescending()”不可用,请首先转换到列表: 如果“OrderByDescending()”不可用,请首先转换到列表:
嗨@haldo,可以选择电影实体吗?嗨@haldo,可以选择电影实体吗?几乎正确。只是缺少了几乎正确的.Average()。只是错过了.Average()
var movieList = await _context.MovieRatings.ToList();
var result = movieList.OrderByDescending(x => x.Rating).Take(5);