gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:30:49 25 4
gpt4 key购买 nike

我有一个关于使用 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来自客户反馈 cfINNER 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com