加载其他表项时使用Linq Include的意义

时间:2014-01-21 10:52:33

标签: asp.net-mvc linq

我注意到在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有什么意义呢?整体而言?

1 个答案:

答案 0 :(得分:2)

如果您使用实体框架Include()告诉EF这些关系应该包含​​在查询中,以便生成正确的连接。这意味着来自ParentTable2的字段将包含在结果中,并且单次往返到服务器。 (这也称为急切加载

但是,如果您删除Include()语句,则EF最初只会从Table加载字段。但是,默认情况下启用了延迟加载,因此当您尝试访问时,会从数据库中检索ParentTable2中的字段。但是,这会导致每个附加关系对服务器进行一次额外的往返

您可以在EF msdn网站的this entry中找到有关加载相关实体的可用选项的更多信息。

因此,如果您的索引视图使用3个表中的字段,Include()方法将需要单个往返(具有较重的查询),而延迟加载方法将需要3个往返。

作为一个基本的经验法则,当您确定需要这些字段时,可以使用Include()。仅在某些情况下需要这些字段时使用延迟加载。在任何情况下,请务必查看this EF performance guide的第8部分,它很好地解释了两个选项及其含义,因此您可以根据需要选择最佳选项。

希望它有所帮助!