c# - LINQ 查询具有连接的列的平均值,按连接表的键分组

标签 c# mysql sql-server linq lambda

我有一个关于使用 lambda 表达式的 LINQ 查询的问题。我有一个相当简单的 SQL 查询,它采用表 CustomerFeedback 中的平均评分,并在键 movie_id 上加入电影表。

我已经用 SQL 和 LINQ sql 语法编写了查询,但是用 lambda 语法(方法语法)编写它对我来说一直是一个难题。

这是数据库方案的原始版本:

TABLE Movie (
    movie_id INT NOT NULL PRIMARY KEY,
    title varchar(255) NOT NULL 
    )

    TABLE CustomerFeedback (
    movie_id int, 
    rating int
    CONSTRAINT fk_CustomerFeedbackMovie FOREIGN KEY (movie_id) REFERENCES Movie (movie_id) ON UPDATE CASCADE
    )

SQL查询: 选择 avg(rating) 作为 AvgRating , m.movi​​e_id 作为 MovieID 来自客户反馈 cf INNER JOIN Movie m ON m.movi​​e_id = cf.movi​​e_id 按 m.movi​​e_id 分组

没有 LAMBDA 语法的 LINQ 中的查询有效:

var averages =(from movie in _context.Movie
                            join feedback in _context.CustomerFeedback on movie.movie_id equals feedback.movie_id
                            group new {movie, feedback } by new
                            {
                                movie.movie_id
                            }
                            into grouping
                            orderby
                                (double?)grouping.Average(p => p.feedback.rating) ascending 
                            select new
                            {
                                grouping.Key.movie_id,
                                rating_average = (double?)grouping.Average(p => p.feedback.rating)
                            }).Take(10);

如果有人能给我一些建议或解决方案,将不胜感激!

编辑:用户 YacoubMassad 请求的导航属性

modelBuilder.Entity<CustomerFeedback>(entity =>
            {
                entity.HasKey(e => e.movie_id);

                entity.Property(e => e.movie_id).ValueGeneratedNever();

                entity.Property(e => e.comments)
                    .IsRequired()
                    .HasMaxLength(255)
                    .HasColumnType("varchar");

                entity.Property(e => e.customer_mail_address)
                    .IsRequired()
                    .HasMaxLength(255)
                    .HasColumnType("varchar");

                entity.Property(e => e.feedback_date).HasColumnType("date");

                entity.HasOne(d => d.customer_mail_addressNavigation).WithMany(p => p.CustomerFeedback).HasForeignKey(d => d.customer_mail_address).OnDelete(DeleteBehavior.Restrict);

                entity.HasOne(d => d.movie).WithOne(p => p.CustomerFeedback).HasForeignKey<CustomerFeedback>(d => d.movie_id).OnDelete(DeleteBehavior.Restrict);
            });

最佳答案

List<Movie> movies = new List<Movie>() { 
            new Movie(){Id = 1, Name = "The Matrix"},
            new Movie(){Id = 2, Name = "Captain America"}
        };

        List<MovieReview> reviews = new List<MovieReview>() 
        { 
            new MovieReview(){MovieId = 1, Review = 8},
            new MovieReview(){MovieId = 1, Review = 7},
            new MovieReview(){MovieId = 2, Review = 5}
        };

        //var movieReviews = reviews.GroupBy(r => r.MovieId).Select(g => new { MovieId = g.Key, AvgReview = g.Average( r => r.Review) });


        var finalReviews = movies.Join(
            reviews.GroupBy(r => r.MovieId).Select(g => new { MovieId = g.Key, AvgReview = g.Average(r => r.Review) }),
            m => m.Id,
            r => r.MovieId,
            (m, r) => new { Name = m.Name, AvgReview = r.AvgReview }).ToList();

        foreach (var f in finalReviews)
        { 
            Console.WriteLine(f.Name + " " + f.AvgReview);
        }

        Console.ReadKey();

实体类

class Movie
{
    public int Id = 0;
    public string Name = "";
}

class MovieReview
{
    public int MovieId = 0;
    public int Review = 0;
}

关于c# - LINQ 查询具有连接的列的平均值,按连接表的键分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37399365/

相关文章:

c# - ASP 连接错误 : Incorrect syntax near the keyword 'User

sql - 检查外键约束 "online"

c# - 如何更改浏览器的后退按钮功能,类似于 asp.net 中的电子商务网站

mysql - 如何循环遍历表的所有行? (MySQL)

sql-server - 为什么在SQL Server 中乘DECIMAL 时会出现精度损失?

PHP MYSQL问题

mysql - MySQL 删除前触发器的正确​​语法是什么?

c# - 当 Lazy<T> 的 .value 属性未锁定时,它如何提供线程安全的延迟加载?

c# - 使用接口(interface)而不是具体类型 IEnumerable 导致异常

c# - 由于不同模式中的对象名称相同,T4 模板中的亚音速转换失败