我有一个关于使用 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.movie_id 作为 MovieID 来自客户反馈 cf INNER JOIN Movie m ON m.movie_id = cf.movie_id 按 m.movie_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/