2012-03-09 12 views
0

私はMVC3を初めて使用しているので、これが基本的であれば謝罪しますが、うまくいかない可能性があります。間接的に関連するテーブルから別のフィールドを取得する

私は3つのテーブル、2つの外部キー(アーティストIDとラベルID)を持つ 'Albums'テーブルを含むビューモデルを持っています。

私は、ラベルテーブルのフィールドを表示するための 'ラベル'コントローラと詳細メソッドを持っています。私は、ラベルに関連するアルバムのコレクションから別個の「アーティスト」を取得しようとしています。

現時点では、アーティストの名前を取得できますが、アルバムごとに1つずつ生成されます。このシナリオのコードは以下のとおりです。

私はコレクションにアーティストを含めるなど、さまざまな機能を使い分けましたが、使い分けはしていません。このように実行可能かどうか、あるいはテーブル間の間接的な関係のために別のアプローチを使用する必要があるかどうかはわかりません。

ご協力いただきありがとうございます。

コントローラー:

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組のアーティストを区別するために使用等値比較。この例では、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> 
関連する問題