剃刀跳过嵌套的foreach循环
问题描述:
在我的数据库中我有一个子表的字符串。在剃刀视图中,我试图通过最终的父级循环,然后过滤几个级别的集合。剃刀跳过嵌套的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)))
{ ...
我仍然得到一个空的结果,所以我假设是空校验没有做我希望它会做什么。
所以,如果任何人都可以给我一些指导,要么是这种方法是否合理,而且如果我可以以某种方式对孙集合进行空检查,或者如果会有更好的方法,将非常感激。
答
我不确定我是否正确。据我所知,你需要过滤空项目和你的问题中的第二个代码示例是好的。在这种情况下,您可以添加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>
}
你为什么不这样做artist.Albums.First()Songs.Select(B => b.SongPlays) – Overmachine
@ Overmachine - 感谢。回复。我试图在if语句检查语句中使用它,但没有任何运气。我想我看到你在这里尝试做什么。实际上,我需要检查每首歌曲,看它是否有SongPlay的集合,而我认为你的语句检查了第一张专辑? – jimwinz
仅仅因为他们不使用视图模型,人们最终在他们的观点中产生了令人难以置信的结果。 –