Asp.net mvc 3 跳过嵌套的foreach循环

Asp.net mvc 3 跳过嵌套的foreach循环,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,在我的数据库中,我有一系列的子表。在razor视图中,我试图循环遍历最终的父对象,然后将集合向下过滤几级 我使用以下摘录使其工作: @foreach (var artist in Model) { <tr> <td> @Html.DisplayFor(modelItem => artist.ArtistName) </td> </tr> foreach (var

在我的数据库中,我有一系列的子表。在razor视图中,我试图循环遍历最终的父对象,然后将集合向下过滤几级

我使用以下摘录使其工作:

@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>
                }
            }
        }
    }
}
我仍然得到一个空的结果,所以我假设空检查没有达到我希望的效果


因此,如果有人能给我一些指导,告诉我这种方法是否合理,我是否能以某种方式对孙辈收藏进行空检查,或者是否有更好的方法,我将不胜感激。

我不确定我是否理解正确。据我所知,您需要过滤空项,您问题中的第二个代码示例在订购方面是可以的。在这种情况下,您可以在选择中添加
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>
}
foreach(艺术家专辑中的var songPlay.Albums.SelectMany(a=>a.Songs.Where(b=>b!=null)。SelectMany(b=>b.SongPlays)))
{
@DisplayFor(a=>songPlay.PlayTime)
}

为什么不这样做艺术家。相册。第一首()歌曲。选择(b=>b.SongPlays)@Overmachine-谢谢回复。我尝试在if null check语句中使用它,但没有任何运气。我想我明白你在这里想做什么了。事实上,我需要检查每首歌,看看它是否有歌曲集,而我认为你的声明检查了第一张专辑?令人难以置信的是,仅仅因为人们不使用视图模型,他们的观点就以这种方式结束。达林-如果不在视图中使用逻辑,你会如何使用视图模型?嗨,迪玛,谢谢你的回答。如果我没有以一种清晰的方式阐述这个问题,我表示歉意——我想这部分是由于缺乏经验。问题是每首歌曲可能有也可能没有歌曲播放的集合,如果没有集合,那么foreach(var songPlay…)将返回null异常。因此,在运行foreach语句之前,首先需要检查集合是否存在。我有更新过滤,假设有空歌曲集的歌曲不符合你的兴趣。
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)))
        { ...
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>
}