score:2

Accepted answer

i am not sure if you are looking for something like this but it's a bit cleaner, it's not split in 2 statements and you might find it helpful. i couldn't use a dbcontext so i used lists to make sure the syntax is correct.

var res = shows.join(venues,
         show => show.venueid,
         venue => venue.venueid,
            (show, venue) => new { show, venue })
                .join(showdates,
                    val => val.show.showid,
                    showdate => showdate.showid,
                        (val, showdate) => new { val.show, val.venue, showdates = showdate })
                            .groupby(u => u.show.showid)
                            .select(grp => new
                            {
                                showid = grp.key,
                                name = grp.firstordefault()?.show.showname,
                                venue = grp.firstordefault()?.venue.venuename,
                                startdate = grp.max(g => g.showdates.datetime)
                            });

score:0

we need to now realation beetwen them one to one or one to many , but not too far from this answer.

 var grouppedresult = shows.include(x=>x.veneu).include(x=>x.showdates)
    .where(x=>x.veneu.any()&&x.showdates.any())
    .groupby(x=>x.showid)
    .select(x=>///anything you want);

or

from show in shows
join veneu in veneu on veneu.veneuid equals show.veneuid
join showdates in showdates on showdates.showid=show.showid
group show by show.id into grouppedshows
select new { ///what you want };

Related Query