Include()在 LINQ 中做什么?

我尝试做了很多研究,但我更多的是一个数据库的家伙-所以即使在 MSDN 的解释,没有任何意义对我来说。有没有人能解释一下,并提供一些例子,说明 Include()语句在 SQL查询中的作用?

188644 次浏览

比如说,你想要一份你所有客户的名单:

var customers = context.Customers.ToList();

让我们假设每个 Customer对象都有一个对其 Orders集的引用,并且每个 Order都有对 LineItems的引用,LineItems也可能引用一个 Product

如您所见,选择具有许多相关实体的顶级对象可能导致查询需要从许多源中提取数据。作为一种性能指标,Include()允许您指出应该从数据库中读取哪些相关实体作为相同查询的一部分。

使用相同的示例,这可能会引入所有相关的订单标头,但不会引入其他记录:

var customersWithOrderDetail = context.Customers.Include("Orders").ToList();

最后一点,自从您要求使用 SQL 以来,没有 Include()的第一个语句可以生成一个简单的语句:

SELECT * FROM Customers;

调用 Include("Orders")的最终声明可能是这样的:

SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;

我只想说“包含”是急切加载的一部分。Microsoft 在实体框架6教程中对此进行了描述。链接如下: Https://learn.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,可以手动加载相关数据。集合或引用的加载方法。对于包含单个实体的属性,加载方法。(在下面的示例中,如果希望加载 Administrator 导航属性,则将 Collection(x => x.Courses)替换为 Reference(x => x.Administrator)。)通常只有在关闭延迟加载时才使用显式加载。

因为它们不会立即检索属性值,所以延迟加载和显式加载也称为延迟加载。

可以把它想象成是在一个场景中强制执行 Eager-Load,否则您的子项将是惰性加载。

查询 EF 发送到数据库首先会产生一个较大的结果,但在访问时,在访问所包含的项目时不会进行后续查询。

另一方面,如果没有它,EF 将在以后第一次访问子项时执行单独的查询。

Include ()方法只是为了包括相关的实体。 但是 sql 上发生的事情是基于这些实体之间的关系的这些实体包含了你要获取的数据。

您的 LINQ 查询决定使用什么类型的连接,可能有左外部连接,可能有内部连接,可能有右连接等等。. @ Corey Adler