C# 按子集合属性进行EF和LINQ查询

C# 按子集合属性进行EF和LINQ查询,c#,linq,entity-framework,C#,Linq,Entity Framework,我试图根据子集合的子集合中的值来排列“父”项列表。以下是具体情况 我有一个电影实体(映射到电影表),它有一对多的发布实体集合(映射到发布表)。每个版本都有一个或多个ReleaseDate实体(映射到ReleaseDates表) 我该怎么做呢?嗯,我改变了解决这个问题的方法,并根据“正常”的方法解决了它,其中一种方法作为答案给出,但随后被海报删除。我最后做的是将我的select向下移动到存储库层,在那里我有DbContext,并且能够像这样执行“简单”的左-外连接样式查询 var orderedF

我试图根据子集合的子集合中的值来排列“父”项列表。以下是具体情况

我有一个电影实体(映射到电影表),它有一对多的发布实体集合(映射到发布表)。每个版本都有一个或多个ReleaseDate实体(映射到ReleaseDates表)


我该怎么做呢?

嗯,我改变了解决这个问题的方法,并根据“正常”的方法解决了它,其中一种方法作为答案给出,但随后被海报删除。我最后做的是将我的select向下移动到存储库层,在那里我有DbContext,并且能够像这样执行“简单”的左-外连接样式查询

var orderedFilms = Films.OrderBy(a=> a.Releases.Any() ?  
                                     a.Releases.Select(x=>x.ReleaseDates.Any() ?
                                                           x.ReleaseDates.Min(d=>d.Date).Date :
                                                             DateTime.Now).Min() : DateTime.Now);
var films = (from f in db.Films
             join r in db.Releases on f.Id equals r.FilmId into FR
             from a in FR.DefaultIfEmpty()
             join d in db.ReleaseDates on a.Id equals d.ReleaseId into RRD
             from b in RRD.DefaultIfEmpty()
             orderby b.Date ascending
             select f);

@KingKing,谢谢你的回答,我想它在其他一些地方可能会派上用场,我们有基于子集合属性甚至子集合属性的聚合字段。

asc
是从最小到最大,而
desc
是从最大到最小。换句话说,如果我没弄错的话,我认为您应该将
Max
更改为
Min
我想在最早的上映日期之前订购电影
@ErikPhilips谢谢,我的英语不够好,有时我混淆了最新和最早的版本。“上映”来自哪里?我没有单独的发行集,它们是电影实体的子集合。(即电影发行),所以我认为我不能采取这种方法。另外,电影和发行版之间以及发行版和发行日期之间都有导航属性,所以我想利用这些属性。我认为您的示例假设我没有导航属性。(如果这是可能的并且有意义的话???。@HenryC是的,你的
电影
类没有发布,我可以在你的帖子中看到。这给了我3个错误,其中2个是“类型参数无法推断”错误,我肯定是这3个错误的原因。所以“films.OrderBy”是第一个,而“a.Releases.Select”是第二个。如果我稍微简化一下,也许会有所帮助。假设此时不涉及数据库/DbContext。我现在有一个很好的电影收藏。这有帮助吗,还是让情况变得更加困难?如果需要,我愿意重构以简化事情。
var orderedFilms = Films.OrderBy(a=> a.Releases.Any() ?  
                                     a.Releases.Select(x=>x.ReleaseDates.Any() ?
                                                           x.ReleaseDates.Min(d=>d.Date).Date :
                                                             DateTime.Now).Min() : DateTime.Now);
var films = (from f in db.Films
             join r in db.Releases on f.Id equals r.FilmId into FR
             from a in FR.DefaultIfEmpty()
             join d in db.ReleaseDates on a.Id equals d.ReleaseId into RRD
             from b in RRD.DefaultIfEmpty()
             orderby b.Date ascending
             select f);