ASP MVC - 读取相关数据

ASP MVC - Reading Related Data

有 faster/better 方法吗?
我这里有一个简单的一对多关系。

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>

即席查询不编译也没有执行计划,因此当您使用索引视图时,您获得的性能优于在没有索引和执行计划的情况下动态连接表的 linq 查询。但这在您拥有大量数据和/或负载时很有用。 另一方面,您可以使用 Automapper 来展平复杂的对象 像这样 https://github.com/AutoMapper/AutoMapper/wiki/Flattening 简化 ViewModel 到 Model 的映射,反之亦然。 我在我的一些项目中使用了 Automapper,并且能够简化我的项目。 您必须根据自己的需要进行权衡。

假设你使用的是Entity Framework,从ProfessorSubject是一对多的关系。

而不是加载所有 Subject,我们只需要加载一些有教授的科目,使用 eager loading。您的代码将是:

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

然后,在视图中,您只需这样做:

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

代码未经测试,但我相信它运行良好。