繁体   English   中英

根据平均 c# linq 延迟加载获取前 5 条记录

[英]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,您希望:

  1. MovieId
  2. Select MovieIdAverage rating
  3. 按降序排列
  4. 返回您需要的结果数量

此查询将复制您的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM