从间接相关的表中获取不同的字段

时间:2012-03-09 14:25:27

标签: asp.net-mvc-3

我是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; }
}

}

1 个答案:

答案 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>