Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 从间接相关表中获取不同的字段_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 从间接相关表中获取不同的字段

Asp.net mvc 3 从间接相关表中获取不同的字段,asp.net-mvc-3,Asp.net Mvc 3,我是MVC3新手,如果这是基本的,我很抱歉,但我无法解决 我有一个视图模型,其中包括3个表,一个“Albums”表,其中包含2个外键艺术家ID和标签ID 我有一个“标签”控制器和一个显示标签表字段的详细信息方法。我试图从与标签相关的专辑集合中获得不同的“艺术家” 目前,我可以得到艺术家的名字,但是每一张专辑都会生成一个——我已经在下面包含了这个场景的代码 我尝试了很多不同的方法,比如在收藏中加入艺术家,使用Distinct和group by函数,但都没有用。不确定这样做是否可行,或者由于表之间的

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