ASP MVC - 阅读相关数据

时间:2016-05-10 04:08:36

标签: asp.net-mvc relationship

有更快/更好的方法吗?
我这里有一对简单的关系。

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>

2 个答案:

答案 0 :(得分:1)

假设您使用的是Entity Framework,并且ProfessorSubject之间存在一对多关系。

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

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>

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

答案 1 :(得分:-1)

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