1

我正在尝试根据其子集合的子集合中的值订购“父”项目列表。以下是具体...

我有一个 Film 实体(映射到 Films 表),它具有一对多的 Release 实体集合(映射到 Releases 表)。每个 Release 都有一个或多个 ReleaseDate 实体(映射到 ReleaseDates 表)。

public class Film {
    public int Id {get;set;}
    public string Title {get;set;}
    /* ... more properties here ...*/
}

public class Release {
    public int Id {get;set;}
    public int FilmId {get;set;}
    public virtual Film Film {get;set;}
    public virtual ICollection<ReleaseDate> ReleaseDates { get; set; }
    /* ... more properties here ...*/
}

public class ReleaseDate {
    public int Id {get;set;}
    public DateTime Date {get;set;}
    public int ReleaseId {get;set;}
    public virtual Release Release {get;set;}
    /* ... more properties here ...*/
}

现在,我想按最早的发行日期订购电影,但显然一部电影可能没有发行,发行也可能没有发行日期(同样,1-* 关系)。SQL 等价物将是...

SELECT * /* or whatever columns...*/
FROM dbo.Films F
LEFT OUTER JOIN dbo.Releases R ON R.FilmId = F.Id
LEFT OUTER JOIN dbo.ReleaseDates RD ON RD.ReleaseId = R.Id
ORDER BY RD.[Date] ASC /* or DESC */

我该怎么做呢?

4

2 回答 2

0
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);
于 2013-08-14T03:29:57.943 回答
0

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

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,感谢您的回答,我认为它可能会在我们拥有基于子集合属性甚至子子集合属性的此类聚合字段的其他一些地方派上用场。

于 2013-08-16T15:45:09.717 回答