I have a question regarding LINQ queries using lambda expressions. I have a fairly simple SQL query which takes the average of the rating in table CustomerFeedback, and joins the Movie table on the key movie_id.
I have written the query in SQL and LINQ sql syntax, but writing it in lambda syntax (method syntax) has been a struggle for me.
This is a primitive version of the database scheme:
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
)
The query in SQL: SELECT avg(rating) as AvgRating , m.movie_id as MovieID FROM CustomerFeedback cf INNER JOIN Movie m ON m.movie_id = cf.movie_id GROUP BY m.movie_id
The query in LINQ without LAMBDA syntax which works:
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);
If anyone could give me a few pointers or a solution it would be greatly appreciated!
EDIT: The navigation properties as requested by user 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);
});