2016-03-26 26 views
1

私はASP.net MVCで作業しています。C#私は2つのモデルクラス、アーティストとアルバムを持っています。私はそこにメソッドを入れるためにOperationsという新しいクラスを作成しました。コントローラクラスやモデルクラスではなく、別のレイヤーにメソッドを実装するためのMVCに関する良い習慣)。私は両方のモデルの情報を返すメソッドが必要なので、私はすでにArtistIDで結合された2つのテーブルArtistとAlbumsを持つデータベースを作成しました。私はクエリがどのように動作する必要があるのか​​知っていますが、そのメソッドを返す必要がありますか?これを開発する正しい方法がどれか分かりますか?コントローラーがこのメソッドを呼び出して、それがアーティストとアルバムのミックスを考慮してビューを作成する方法を教えてください。このためにViewModelを具体的に作成する必要がありますか?どのように私はこれを行うことができますか?ビューでjoin linqクエリを表示

モデル・クラス:

public class Artist 
{ 
     public int ArtistID { get; set; } 
     public string Name { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
     public virtual List<Album> Albums { get; set; } 
} 

public class Album 
{ 
     public int AlbumID { get; set; } 
     public string AlbumName { get; set; } 
     public virtual Artist Artist { get; set; } 
     public int ArtistID { get; set; }    
} 

オペレーションクラス:それは、何がそれを返す必要があり、アーティストとアルバムの間の結合を返すので、それがAbumリストを返す作業won`t AlbumsByArtist私は、メソッドを呼び出しましたか?コントローラを使用して結果をビューに送信し、これらの結果をビューでどのように表示できますか?

public class Operations 
{ 
     MusicStoreDbContext db = new MusicStoreDbContext(); 
     public List<Album> AlbumsByArtist() 
     { 
      var temp = (from ar in db.Artists 
         join al in db.Albums on ar.ArtistID equals al.ArtistID 
         select new { al.AlbumName, ar.Name, ar.LastName }); 
      return temp; 
     } 
} 

答えて

4

ここにViewModelを作成する必要があります。 ViewModelsは、必要に応じて特定のデータを表示するビューに固有です。私たちは、代わりにビューで直接データベースモデルを使用してのビューのために、常にビューモデルを作成する必要があります。

public class AlbumsByArtistVM 
{ 
     public string AlbumName {get;set;} 
     public string ArtistName {get;set} 
     public string ArtistLLastName {get;set;} 

} 

、それはのように返します。

public List<AlbumsByArtistVM> AlbumsByArtist() 
{ 
    var temp = (from ar in db.Artists 
       join al in db.Albums on ar.ArtistID equals al.ArtistID 
       select new AlbumsByArtistVM 
       { 
        AlbumName =al.AlbumName, 
        ArtistName =ar.Name, 
        ArtistLLastName =ar.LastName 
       }); 
    return temp; 
}