我是MVC3的新手,如果这是基本的,请道歉,但我无法解决。
我有一个包含3个表的视图模型,一个带有2个外键的“专辑”表(艺术家ID和标签ID)。
我有一个'Labels'控制器和一个Details方法,我在其中显示Label表字段。我试图从与标签相关的专辑集合中获得独特的“艺术家”。
目前,我可以获得艺术家的名字,但每张专辑都会生成一个 - 我在下面列出了此方案的代码。
我尝试了很多不同的东西,比如在收藏中包括艺术家,并使用Distinct和group by功能,但无济于事。不确定这是否可行,或者由于表之间的间接关系,我是否需要使用不同的方法。
非常感谢任何帮助。
控制器:
public ActionResult Details(int id)
{
var viewModel = new LabelsDetailsVM();
viewModel.Lables = db.Labels
.Include(a => a.Albums)
.SingleOrDefault(x => x.LabelID == id);
return View(viewModel);
查看:
@foreach (var artist in Model.Lables.Albums)
{
<tr>
<td>
@Html.DisplayFor(model => artist.Artist.ArtistName)
</td>
</tr>
}
查看模型
public class LabelsDetailsVM
{
public Label Lables { get; set; }
public IEnumerable<Album> Albums { get; set; }
public IEnumerable<Artist> Artists { get; set; }
}
}
答案 0 :(得分:0)
这是一个可以让你走上正确轨道的例子:
查看模型:
public class LabelViewModel
{
public Label Label { get; set; }
public IEnumerable<Artist> Artists { get; set; }
}
控制器:
public class LabelController : Controller
{
public ActionResult Details(int id)
{
var label = db.Labels
.Include(l => l.Albums)
.SingleOrDefault(l => l.LabelID == id);
if (label == null)
{
return HttpNotFound();
}
var distinctArtists = label
.Albums
.Select(a => a.Artist)
.Distinct(ArtistComparer.Default);
var model = new LabelViewModel
{
Label = label,
Artists = distinctArtists
};
return View(model);
}
}
并且相等比较器用于区分控制器中使用的2个艺术家,这些艺术家当然可以根据您的要求进行调整。在此示例中,如果它们具有相同的ID,则认为2个艺术家代表相同的实体。但是你可以使用其他一些属性,比如名称等等,这些都取决于你需要的东西:
public class ArtistComparer : IEqualityComparer<Artist>
{
protected ArtistComparer()
{
}
private static readonly IEqualityComparer<Artist> _default = new ArtistComparer();
public static IEqualityComparer<Artist> Default
{
get
{
return _default;
}
}
public bool Equals(Artist x, Artist y)
{
if (x != null && y != null)
{
return x.ArtistID.Equals(y.ArtistID);
}
return false;
}
public int GetHashCode(Artist obj)
{
return obj.ArtistID.GetHashCode();
}
}
查看:
@model LabelViewModel
<h3>@Html.DisplayFor(x => x.Label.LabelName)</h3>
<div>Artists</div>
<table>
<thead>
<tr>
<th>artist name</th>
</tr>
</thead>
<tbody>
@foreach (var artist in Model.Artists)
{
<tr>
<td>@artist.ArtistName</td>
</tr>
}
</tbody>
</table>