剃刀跳过嵌套的foreach循环

时间:2013-05-21 14:49:16

标签: asp.net-mvc-3 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>
                }
            }
        }
    }
}

这个问题是我无法通过PlayTime对整个子集合进行排序。为了解决这个问题,我试图通过使用以下方法跳过前面的foreach循环来实现它:

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

这似乎无法在控制器操作中应用过滤器,但在应用过滤器时返回null结果。我已经尝试在视图中检查结果是否为null,但我无法使其工作 - 例如:

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)))
        { ...

我仍然得到一个null结果,所以我假设null检查没有做我希望它会做的事情。

因此,如果有人能就这种方法是否合理以及我是否能以某种方式对孙子系列进行无效检查,或者是否会有更好的方法给我一些指导,那将非常感激。

1 个答案:

答案 0 :(得分: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>
}