1

在我的数据库中,我有一串子表。在剃刀视图中,我试图遍历最终父级,然后将集合向下过滤几个级别。

我已经使用以下提取物让它工作:

@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>
    }

这似乎在没有在控制器操作中应用过滤器的情况下工作,但在应用过滤器时返回空结果。如果结果为空,我已经尝试检查视图,但我无法让它工作 - 例如:

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

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

因此,如果有人可以就这种方法是否明智以及我能否以某种方式对孙子集合进行空值检查,或者是否有更好的方法给我一些指导,我将不胜感激。

4

1 回答 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>
}
于 2013-05-21T16:28:09.460 回答