有更快/更好的方法吗?
我这里有一对简单的关系。
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>
答案 0 :(得分:1)
假设您使用的是Entity Framework
,并且Professor
与Subject
之间存在一对多关系。
我们只需要使用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,我已经能够简化我的项目了。 你必须根据自己的需要进行权衡。