2016-05-10 14 views
0

Gibt es einen schnelleren/besseren Weg, dies zu tun?
Ich habe hier eine einfache eins zu viele Beziehung.ASP MVC - Lesen verwandter Daten

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; } 
} 

Implementierung ////////////////////////////////////

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); 
    } 

View - Loading Thema für jeden Professor

<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

Wenn Sie Ihre Modelle und Beziehungen korrekt eingerichtet haben, enthält 'Professor' seine Sammlung von' Subject' und alles, was Sie benötigen, ist 'foreach (var subj in prof.Subjects) { @ subj.Name, } ' –

Antwort

1

Angenommen, Sie verwenden Entity Framework, und es gibt eine Ein-Viele-Beziehung von Professor zu Subject.

Anstatt alle Subject zu laden, müssen wir nur einige Fächer laden, die ihren Professor haben, mit eager loading. Ihr Code wird sein:

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); 
} 

Dann in der Ansicht, die Sie tun nur so:

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

Der Code ist nicht getestet, aber ich glaube, es funktioniert gut.

+0

yeah ich denke, es wird funktionieren, das ist die vollständige Version von @Stephen Muecke 's Antwort – Middleman

+0

BTW Ich bin neu in Linq und Lambda Ausdruck, deshalb frage ich diese noob Frage .. Vielen Dank Jungs! – Middleman

+1

Keine Sorge, Fragen sind immer gut: D – AnhTriet

-1

Ad-hoc-Abfrage nicht kompiliert und haben so nicht Ausführungsplan wenn Sie indizierte Sicht Sie die Leistung besser als Linq-Abfrage erhalten, die Tabellen im laufenden Betrieb anschließen, ohne Index und Ausführungsplan. aber das ist nützlich, wenn Sie riesige Daten und/oder laden. in der anderen Hand können Sie Automapper verwenden, um komplexe Objekte zu glätten wie dieses https://github.com/AutoMapper/AutoMapper/wiki/Flattening , um Mapping ViewModel zu Model And Vise Versa zu vereinfachen. Ich habe Automapper in einigen meiner Projekte verwendet und ich konnte meine Projekte vereinfachen. müssen Sie basierend auf Ihren Anforderungen handeln.