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
,从Professor
到Subject
是一对多的关系。
而不是加载所有 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>
代码未经测试,但我相信它运行良好。
有 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
,从Professor
到Subject
是一对多的关系。
而不是加载所有 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>
代码未经测试,但我相信它运行良好。