2016-05-10 12 views
0

これを行うより速く/より良い方法がありますか?
私はここに単純な1対多の関係があります。ASP MVC - 関連データの読み込み

public class Professor 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual IEnumerable<Subject> Subjects { get; set; } 
} 

public class Subject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int ProfessorId { get; set; } 
    public virtual Professor Professor { get; set; } 
} 

実装 ////////////////////////////////////

public ActionResult Index() 
    { 
     TestDBContext db = new TestDBContext(); 

     var profs = db.Professors.ToList(); 
     var subjs = db.Subjects.ToList(); 

     var vm = new ProfStudVM() 
     { 
      Professors = profs, 
      Subjects = subjs 
     }; 

     return View(vm); 
    } 

ビュー - ロード対象の各教授のために

<div> 
@foreach (var prof in Model.Professors) 
{ 
    <p>@prof.Name</p> 
    foreach (var subj in Model.Subjects) 
    { 
     if (subj.ProfessorId == prof.Id) 
     { 
      <span>@subj.Name , </span> 
     } 
    } 
    <hr /> 
} 
</div> 
+1

モデルと関係を正しく設定した場合、 'Professor'には' Subject'のコレクションが含まれています。必要なのは 'foreach(prof.Subjects内のvarサブ){ @ subj.Name、 } ' –

答えて

1

Entity Frameworkを使用し、ProfessorからSubjectまでの1対多の関係があるとします。

Subjectのすべてを読み込む代わりに、教授のある科目を読み込むには、eager loadingを使用するだけです。あなたのコードは次のようになります。

<div> 
    @foreach (var prof in Model) 
    { 
     <p>@prof.Name</p> 
     foreach (var subj in prof.Subjects) 
     { 
      <span>@subj.Name , </span> 
     } 
     <hr /> 
    } 
</div> 

コードがテストされていませんが、私はそれがうまく機能信じる:

public ActionResult Index() 
{ 
    TestDBContext db = new TestDBContext(); 

    // Remember to add using System.Data.Entity 
    var profs = db.Professors.Include(x => x.Subjects).ToList(); 

    return View(profs); 
} 

次に、ビューで、あなただけのように行います。

+0

ええ、私はそれが動作すると思う、これは@Stephen Mueckeの答え – Middleman

+0

btwの完全なバージョンです。私はLinqとラムダ式では新しいので、私はこのnoobの質問をしています。 – Middleman

+1

心配しないで、質問は常に良いです:D – AnhTriet

-1

アドホッククエリを使用して、インデックス付きビューを使用するときに、あなたがより良いことなく、その場でテーブルを結合LINQクエリよりもパフォーマンスを得るコンパイルしないと実行計画を持っていないんインデックスと実行計画。しかし、これは巨大なデータや負荷がある場合に便利です。一方、 では、Automapperを使用して、複雑なオブジェクトを平坦化する のようにhttps://github.com/AutoMapper/AutoMapper/wiki/Flattening を使用して、ViewModelからModelおよびVise Versaへのマッピングを簡単にすることができます。 私は自分のプロジェクトの一部でAutomapperを使用しており、プロジェクトを簡素化することができました。 必要に応じてトレードオフを行う必要があります。

関連する問題