2012-03-09 55 views
0

我是MVC3的新手,很抱歉,如果这是基本的,但我不能解决它。从间接相关的表获取不同的字段

我有一个包含3个表的视图模型,一个包含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); 

查看:

@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

下面是一个例子,可能让你在正确的轨道上:

视图模型:

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,则它们代表相同的实体。但是你可以用一些其他的属性,如名字等工作,一切都取决于你所需要的:

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>