Asp.net mvc 3 从间接相关表中获取不同的字段
我是MVC3新手,如果这是基本的,我很抱歉,但我无法解决 我有一个视图模型,其中包括3个表,一个“Albums”表,其中包含2个外键艺术家ID和标签ID 我有一个“标签”控制器和一个显示标签表字段的详细信息方法。我试图从与标签相关的专辑集合中获得不同的“艺术家” 目前,我可以得到艺术家的名字,但是每一张专辑都会生成一个——我已经在下面包含了这个场景的代码 我尝试了很多不同的方法,比如在收藏中加入艺术家,使用Distinct和group by函数,但都没有用。不确定这样做是否可行,或者由于表之间的间接关系,是否需要使用不同的方法 非常感谢您的帮助 控制器:Asp.net mvc 3 从间接相关表中获取不同的字段,asp.net-mvc-3,Asp.net Mvc 3,我是MVC3新手,如果这是基本的,我很抱歉,但我无法解决 我有一个视图模型,其中包括3个表,一个“Albums”表,其中包含2个外键艺术家ID和标签ID 我有一个“标签”控制器和一个显示标签表字段的详细信息方法。我试图从与标签相关的专辑集合中获得不同的“艺术家” 目前,我可以得到艺术家的名字,但是每一张专辑都会生成一个——我已经在下面包含了这个场景的代码 我尝试了很多不同的方法,比如在收藏中加入艺术家,使用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);
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);
}
}
视图:
视图模型
public class LabelsDetailsVM
{
public Label Lables { get; set; }
public IEnumerable<Album> Albums { get; set; }
public IEnumerable<Artist> Artists { get; set; }
}
}以下是一个可能让您走上正轨的示例: 视图模型:
public class LabelViewModel
{
public Label Label { get; set; }
public IEnumerable<Artist> Artists { get; set; }
}
相等比较器用于区分控制器中使用的两个美工师,当然可以根据您的要求进行调整。在本例中,如果两个艺术家具有相同的ID,则认为他们代表相同的实体。但您可以使用一些其他属性,如名称等,这一切取决于您需要什么:
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();
}
}
视图:
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>