2013-05-21 124 views
1

在我的数据库中我有一个子表的字符串。在剃刀视图中,我试图通过最终的父级循环,然后过滤几个级别的集合。剃刀跳过嵌套的foreach循环

我有它使用以下摘录的工作:

@foreach (var artist in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => artist.ArtistName) 
     </td> 
    </tr> 

    foreach (var album in artist.Albums) 
    { 
     foreach (var song in album.Songs) 
     { 
      if (song.SongPlays != null) 
      { 
       foreach (var songPlay in song.SongPlays) 
       {   
    <tr> 
     <td> 
      @Html.DisplayFor(a => songPlay.PlayTime) 
     </td> 
    </tr> 
       } 
      } 
     } 
    } 
} 

这样做的问题是,我不能排序播放时间整个儿集合。为了解决这个问题,然后我试图得到它的工作跳过了前面的foreach使用循环:

foreach (var songPlay in artist.Albums.SelectMany(a => a.Songs.SelectMany(b => b.SongPlays))) 
    { 
    <tr> 
     <td> 
      @Html.DisplayFor(a => songPlay.PlayTime) 
     </td> 
    </tr> 
    } 

这似乎没有在控制器操作应用的过滤工作,但在应用过滤器时返回一个空的结果。我曾尝试在视图中检查,如果结果为空,但我不能得到这个工作 - 是这样的:

if (artist.Albums.Select(a => a.Songs.Select(b => b.SongPlays)) != null) 
    { 
     foreach (var songPlay in artist.Albums.SelectMany(a => a.Songs.SelectMany(b => b.SongPlays))) 
     { ... 

我仍然得到一个空的结果,所以我假设是空校验没有做我希望它会做什么。

所以,如果任何人都可以给我一些指导,要么是这种方法是否合理,而且如果我可以以某种方式对孙集合进行空检查,或者如果会有更好的方法,将非常感激。

+0

你为什么不这样做artist.Albums.First()Songs.Select(B => b.SongPlays) – Overmachine

+0

@ Overmachine - 感谢。回复。我试图在if语句检查语句中使用它,但没有任何运气。我想我看到你在这里尝试做什么。实际上,我需要检查每首歌曲,看它是否有SongPlay的集合,而我认为你的语句检查了第一张专辑? – jimwinz

+1

仅仅因为他们不使用视图模型,人们最终在他们的观点中产生了令人难以置信的结果。 –

回答

0

我不确定我是否正确。据我所知,你需要过滤空项目和你的问题中的第二个代码示例是好的。在这种情况下,您可以添加Where子句的选择:

foreach (var songPlay in artist.Albums.SelectMany(a => a.Songs.Where(b => b != null).SelectMany(b => b.SongPlays))) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(a => songPlay.PlayTime) 
     </td> 
    </tr> 
} 
+0

嗨迪玛,谢谢你的回复。如果我没有以清晰的方式表达问题,我表示歉意 - 我想这是因为缺乏经验。问题是,每首歌曲可能有也可能没有歌曲集合,如果没有集合,则foreach(var songPlay ...)将返回空值异常。因此,我需要在运行foreach语句之前检查集合是否存在。 – jimwinz

+0

没错。我有更新过滤功能,假设带有空SongPlay歌曲的歌曲不在您的个人电脑中。 – Dima