【问题标题】:ASP MVC - Reading Related DataASP MVC - 读取相关数据
【发布时间】:2016-05-10 04:08:35
【问题描述】:

有没有更快/更好的方法来做到这一点?
我这里有一个简单的一对多关系。

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>

【问题讨论】:

  • 如果您正确设置了模型和关系,那么Professor 将包含它的Subject 集合,而您只需要foreach (var subj in prof.Subjects) { &lt;span&gt;@subj.Name , &lt;/span&gt; }

标签: asp.net-mvc relationship


【解决方案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>

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

【讨论】:

  • 是的,我认为它会起作用,这是@Stephen Muecke 答案的完整版本
  • 顺便说一句,我是 Linq 和 lambda 表达式的新手,这就是我问这个菜鸟问题的原因。非常感谢你们!
  • 哪个更快,使用 lambda 查询还是使用 linq 查询? @AnhTriet
  • 它们是一样的。检查此post 了解更多信息:)
  • 酷,Linq 表达式更具可读性,但 Lambda 更短。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 2012-02-21
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多