Asp.net mvc ASP MVC-读取相关数据

Asp.net mvc ASP MVC-读取相关数据,asp.net-mvc,relationship,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 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; }
}
每个教授的视图加载主题

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

@foreach(模型教授var prof.Professors)
{
@教授姓名

foreach(模型主体中的var Sub) { 如果(学科教授Id==教授Id) { @主体名称, } }
}
即席查询不编译,也没有执行计划,因此当您使用索引视图时,可以获得比linq查询更好的性能,linq查询在没有索引和执行计划的情况下动态连接表。但是,当您拥有大量数据和/或负载时,这是非常有用的。 另一方面,您可以使用Automapper展平复杂对象 这样地 简化视图模型到模型的映射,反之亦然。 我在我的一些项目中使用了Automapper,我能够简化我的项目。
您必须根据需要进行权衡。

即席查询不编译,也没有执行计划,因此当您使用索引视图时,您可以获得比linq查询更好的性能,linq查询在没有索引和执行计划的情况下动态连接表。但是,当您拥有大量数据和/或负载时,这是非常有用的。 另一方面,您可以使用Automapper展平复杂对象 这样地 简化视图模型到模型的映射,反之亦然。 我在我的一些项目中使用了Automapper,我能够简化我的项目。
您必须根据需要进行权衡。

假设您使用的是
实体框架
,并且从
教授
主题
之间存在一对多关系

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

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>

@foreach(模型中的var prof)
{
@教授姓名

foreach(教授科目中的var Subc) { @主体名称, }
}

代码没有经过测试,但我相信它工作得很好。

假设您使用的是
实体框架
,并且从
教授
主题
之间存在一种一对多关系

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

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>

@foreach(模型中的var prof)
{
@教授姓名

foreach(教授科目中的var Subc) { @主体名称, }
}

代码没有经过测试,但我相信它工作得很好。

如果您正确设置了模型和关系,那么
Professor
将包含
Subject
的集合,您所需要的就是
foreach(prof.Subjects中的var subj){@subj.Name,}
如果您正确设置了模型和关系,然后,
Professor
将包含其
主题的集合
,您所需要的就是
foreach(prof.Subjects中的var sub){@subc.Name,}
是的,我认为它会起作用,这是@Stephen Muecke的答案的完整版本。顺便说一句,我对Linq和lambda表达式不熟悉,这就是我问这个noob问题的原因。。非常感谢你们!使用lambda查询还是使用linq查询,哪个更快@他们是一样的。查看此以了解更多信息:)很酷,Linq表达式更具可读性,但Lambda要短得多。是的,我认为它会起作用,这是@Stephen Muecke的答案的完整版本。顺便说一下,我对Linq和Lambda表达式比较陌生,这就是我问这个noob问题的原因。。非常感谢你们!使用lambda查询还是使用linq查询,哪个更快@他们是一样的。查看此项了解更多信息:)很酷,Linq表达式更具可读性,但Lambda要短得多。