Jim*_*Jim 12 asp.net asp.net-mvc entity-framework entity-framework-4.1 asp.net-mvc-3
在Visual Studio生成的控制器以及示例应用程序(ContosoUniversity)中,Index操作总是具有类似的功能
var departments = db.Departments.Include(d => d.Administrator);
Run Code Online (Sandbox Code Playgroud)
它与之间的区别是什么?
var departments = db.Departments;
Run Code Online (Sandbox Code Playgroud)
首先我怀疑第一个(使用Include)使视图能够检索department.Administrator.但第二个(没有Include)似乎也能够做到这一点.
Ste*_*iel 16
该Include通知实体框架的工作负载急切地为每个部门管理员的结果.在这种情况下,Entity Framework可以使用SQL连接在单个请求中从两个表中获取数据.
代码仍然可以在没有Include的情况下工作,但是当您第一次访问Department的Administrator时,EF将需要命中数据库来加载它(因为它没有预先加载).按需加载数据(懒惰)是一个很好的功能,但它可能是一个严重的性能问题(称为N + 1问题).特别是如果您访问每个部门的管理员(例如,在循环中) - 而不是一个数据库调用,您将最终得到许多!
在第一种情况下(使用 Include),当您department.Administrator从内存中编写服务器时,由于Include方法而急切加载的对象。在第二种情况下,将执行一条 sql 语句从数据库中为每个部门对象获取管理员记录。