我尝试做了很多研究,但我更像是一个数据库人 - 所以即使MSDN中的解释也没有任何意义。任何人都可以解释一下,并提供Include()
语句在SQL
查询中的作用的一些示例吗?
答案 0 :(得分:118)
比如说,您想要获得所有客户的列表:
var customers = context.Customers.ToList();
让我们假设每个Customer
对象都引用了一组Orders
,并且每个Order
都引用了LineItems
,这也可能是Product
引用Include()
。
如您所见,选择具有许多相关实体的顶级对象可能会导致需要从许多来源提取数据的查询。作为性能度量,var customersWithOrderDetail = context.Customers.Include("Orders").ToList();
允许您指示应该从数据库中读取哪些相关实体作为同一查询的一部分。
使用相同的示例,这可能会带来所有相关的订单标题,但没有其他记录:
Include()
作为您要求SQL的最后一点,没有SELECT * FROM Customers;
的第一个语句可以生成一个简单的语句:
Include("Orders")
调用SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
的最终语句可能如下所示:
{{1}}
答案 1 :(得分:18)
我只想补充一下" Include"是渴望加载的一部分。它在Microsoft的Entity Framework 6教程中描述。链接在这里: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application
摘自链接页面:
以下是实体框架可以将相关数据加载到实体的导航属性中的几种方法:
延迟加载。首次读取实体时,不会检索相关数据。但是,第一次尝试访问导航属性时,将自动检索该导航属性所需的数据。这导致发送到数据库的多个查询 - 一个用于实体本身,一个用于必须检索实体的相关数据。默认情况下,DbContext类启用延迟加载。
急切加载。当读取实体时,会同时检索相关数据。这通常会导致单个连接查询检索所需的所有数据。您可以使用
Include
方法指定预先加载。显式加载。这类似于延迟加载,除了您在代码中显式检索相关数据;当您访问导航属性时,它不会自动发生。通过获取实体的对象状态管理器条目并为集合调用Collection.Load方法或为包含单个实体的属性调用Reference.Load方法,手动加载相关数据。 (在以下示例中,如果您要加载管理员导航属性,则必须将
Collection(x => x.Courses)
替换为Reference(x => x.Administrator)
。)通常,只有在您使用“{1}}时才使用显式加载”。我把懒人装上了。因为他们不会立即检索属性值,所以延迟加载和显式加载也称为延迟加载。
答案 2 :(得分:1)
将其视为在子项将延迟加载的情况下强制执行Eager-Loading。
查询EF发送到数据库首先会产生更大的结果,但在访问时,访问所包含的项目时不会进行后续查询。
另一方面,如果没有它,EF会在您第一次访问子项时执行separte查询。