我注意到在MVC中使用读/写操作视图模板时,基于与其他表保持关系的模型(或者自身,无关紧要)创建控制器,它会自动使用Include实现索引操作:
public ActionResult Index()
{
var table1 = db.Table1.Include(l => l.Parent).Include(l => l.Table2);
return View(table1.ToList());
}
我认为这是使用的,这样当索引加载时,视图将包括所有模型字段(当然不包括ID)以及似乎最有意义的外部字段,例如Parent或Table2。 / p>
但是,我删除了包括这样的部分:
public ActionResult Index()
{
var table1 = db.Table1;
return View(table1.ToList());
}
索引仍然加载外部字段(Parent和Table2),就好像根本不需要Include子句一样。
我的问题是,在这种特定情况下(当MVC加载模板时)使用Include有什么意义呢?整体而言?
答案 0 :(得分:2)
如果您使用实体框架,Include()
告诉EF这些关系应该包含在查询中,以便生成正确的连接。这意味着来自Parent
和Table2
的字段将包含在结果中,并且单次往返到服务器。 (这也称为急切加载)
但是,如果您删除Include()
语句,则EF最初只会从Table
加载字段。但是,默认情况下启用了延迟加载,因此当您尝试访问时,会从数据库中检索Parent
和Table2
中的字段。但是,这会导致每个附加关系对服务器进行一次额外的往返。
您可以在EF msdn网站的this entry中找到有关加载相关实体的可用选项的更多信息。
因此,如果您的索引视图使用3个表中的字段,Include()
方法将需要单个往返(具有较重的查询),而延迟加载方法将需要3个往返。
作为一个基本的经验法则,当您确定需要这些字段时,可以使用Include()
。仅在某些情况下需要这些字段时使用延迟加载。在任何情况下,请务必查看this EF performance guide的第8部分,它很好地解释了两个选项及其含义,因此您可以根据需要选择最佳选项。
希望它有所帮助!