我注意到,在使用MVC中使用读/写操作视图模板时,基于与其他表(或本身无关紧要)保持关系的模型创建控制器时,它会自动使用类似的方式实现索引操作:
public ActionResult Index()
{
var table1 = db.Table1.Include(l => l.Parent).Include(l => l.Table2);
return View(table1.ToList());
}
我认为使用它,以便当索引加载时,视图将包括所有模型字段(当然不包括ID)以及诸如父级或table2之类的外国字段,这似乎是最有意义的。<<<<<<<<<<<<<<<</p>
但是,我删除了包括这样的零件:
public ActionResult Index()
{
var table1 = db.Table1;
return View(table1.ToList());
}
和索引仍然加载了外国字段(父和表2),好像根本不需要includer子句。
我的问题是,在这种特定情况下(MVC加载模板加载)以及总体上使用?
如果您使用的是 entity Framework ,Include()
告诉EF,这些关系应包括在查询中,以便生成适当的加入。这意味着从Parent
和Table2
的字段将包含在服务器的单个圆形trip 的结果中。(这也称为急切加载)
但是,如果您删除了Include()
语句,则EF最初只会从Table
加载字段。但是,它具有 lazy-Loading 默认启用,因此当您尝试访问它们时,从数据库中检索了Parent
和Table2
的字段。然而
您可以在EF MSDN网站的本条目中找到有关可加载相关实体的选项的更多信息。
因此,如果您的索引视图使用3表中的字段,则Include()
方法将需要一个往返(带有较重的查询),而懒惰的方法将需要3个圆形往返。
作为基本的经验法则,当您确定需要这些字段时,可以使用Include()
。仅在某些情况下您需要这些字段时,请使用懒惰加载。在任何情况下,请确保您查看本EF绩效指南的第8节,它很好地解释了选项及其含义,因此您可以为您的需求选择最佳的选项。
希望它有帮助!