【问题标题】:Calculating Average with Linq用 Linq 计算平均值
【发布时间】:2017-01-06 14:34:56
【问题描述】:

我正在尝试使用 Linq 编写一个查询,以计算用户的电影类型(该特定用户观看次数最多)该类型电影的平均排名(排名在不同的表中,并且由许多用户给出,我需要计算该类型中每部电影的平均排名)。

我的方案是这样的:

我现在的代码是这样的:

var extractMoviesAndTheirGenre =
                        from item in results join second in database.MovieGenres on item.movieId equals second.movieId
                        where item.movieId.Equals(second.movieId)
                        select new
                        {
                            MovieId = item.movieId,
                            GenreName = second.Genre.genreName,
                            GenreId = second.genreId
                        };
        var extractGenreNeeded =
                        from item in extractMoviesAndTheirGenre
                        group item by new
                        {
                            GenreName = item.GenreName,
                            GenreId = item.GenreId
                        }
                        into grouped
                        select new
                        {
                            GenreId = grouped.Key.GenreId,
                            GenreName = grouped.Key.GenreName,
                            CountGenre = grouped.Count(x => x.GenreId == grouped.Key.GenreId),
                        };
        extractGenreNeeded = (extractGenreNeeded.OrderByDescending(x => x.CountGenre).Take(1));
    var GenreId = extractGenreNeeded.FirstOrDefault().GenreId.ToString();
        var extractMoviesInFoundGenre =
                        from item in extractGenreNeeded
                        join second in database.MovieGenres on item.GenreId equals second.genreId
                        where second.genreId.Equals(GenreId)
                        select new
                        {
                            MovieId = second.movieId
                        };
        var extractingMoviesInGenreAndTheirAvarageRank =
                        from item in extractMoviesInFoundGenre
                        join second in database.UserMovieRanks on item.MovieId equals second.movieId
                        select new
                        {
                            MovieId = item.MovieId,
                            Rank = second.movieRank
                        };

如您所见,我能够为用户隔离最受关注的类型(我得到该用户观看的电影列表作为查询的输入,此输入被命名为 IQueryable 类型的结果)我无法计算该类型的每部电影的平均得分...

谢谢,

【问题讨论】:

  • 你为什么不给你的变量一个有意义的名字呢?您和我们都更容易理解您的代码。
  • 你可能会看到Get Average Using LINQ
  • 为了您的方便,我编辑了我的代码......丹尼尔我读了它,它对我没有用,因为它不是我的情况..
  • 如果不是纯 SQL,你怎么会没有。从那里开始并向后工作。
  • 在 SQL 中,我只会在 Have 子句或其他内容中对该列进行平均...我这里没有.. 帮助将不胜感激...我不会问如果我知道如何用 LINQ 做到这一点......

标签: c# linq average


【解决方案1】:

你已经有了每部电影的排名,所以在你的代码之后

var extractingMoviesInGenreAndTheirAvarageRank =
        from item in extractMoviesInFoundGenre
        join second in database.UserMovieRanks on item.MovieId equals second.movieId
        select new
        {
            MovieId = item.MovieId,
            Rank = second.movieRank
        };

你应该得到平均值,在这种情况下使用 lambda 表达式:

double avg = extractingMoviesInGenreAndTheirAvarageRank.Average(x => x.Rank);

另外,如果您只想要每个用户的平均值,而不关心 MovieId,您可以在第一个查询中完成所有操作:

var extractingMoviesInGenreAndTheirAvarageRank =
        (from item in extractMoviesInFoundGenre
        join second in database.UserMovieRanks on item.MovieId equals second.movieId
        select second.movieRank).Average();

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2013-01-14
    • 2018-11-16
    • 2020-02-16
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多