C# 用Linq计算平均值

C# 用Linq计算平均值,c#,linq,average,C#,Linq,Average,我正在尝试使用Linq编写一个查询,以计算某个用户(该特定用户观看率最高)的电影类型的平均排名(排名位于不同的表中,由许多用户给出,我需要计算该类型中每部电影的平均排名) 我的计划是: 我现在的代码是: var extractMoviesAndTheirGenre = from item in results join second in database.MovieGenres on item.movieId equals second.mov

我正在尝试使用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类型的结果),我无法计算该类型中每部电影的平均分数


谢谢,

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

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();

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

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();

为什么不给变量起个有意义的名字呢?这将使您和我们更容易理解您的代码。您可能会看到,为了方便您,我编辑了我的代码。。。Daniel我读了它,但它对我没有用,因为它不是我的案子..你怎么会没有这个我是纯SQL的。在SQL中,我会在Having子句中的那一列上加一个平均值,或者其他什么。。。我这里没有。。我们将不胜感激。。。我不想问我是否知道如何使用LINQ实现这一点……为什么不给变量起个有意义的名字呢?这将使您和我们更容易理解您的代码。您可能会看到,为了方便您,我编辑了我的代码。。。Daniel我读了它,但它对我没有用,因为它不是我的案子..你怎么会没有这个我是纯SQL的。在SQL中,我会在Having子句中的那一列上加一个平均值,或者其他什么。。。我这里没有。。我们将不胜感激。。。我不想问我是否有一个线索如何与林克做到这一点。。。