Include()在LINQ中做了什么?

C.J*_*.J. 72 sql linq

我尝试做了很多研究,但我更像是一个数据库人 - 所以即使MSDN中的解释对我也没有任何意义.任何人都可以解释一下,并提供一些关于查询Include()术语中的声明的例子SQL吗?

Yuc*_*uck 129

比方说,您想获得所有客户的列表:

var customers = context.Customers.ToList();
Run Code Online (Sandbox Code Playgroud)

让我们假设每个Customer对象都有其一套的参考Orders,并且每个Order参考了LineItems也可以参考Product.

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

使用相同的示例,这可能会带来所有相关的订单标题,但没有其他记录:

var customersWithOrderDetail = context.Customers.Include("Orders").ToList();
Run Code Online (Sandbox Code Playgroud)

作为你要求SQL的最后一点,第一个语句没有Include()生成一个简单的语句:

SELECT * FROM Customers;
Run Code Online (Sandbox Code Playgroud)

调用的最终语句Include("Orders")可能如下所示:

SELECT *
FROM Customers JOIN Orders ON Customers.Id = Orders.CustomerId;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。使用您的示例,我可以说如果我还想包括 `LineItems` 和 `Products`,LINQ 查询应如下所示:`var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems" ).Include("Products").ToList();` ? (3认同)
  • @Tk1993 当外键可以为空时,它是“Left Join”;当外键不可以为空时,它是“Inner Join”。 (3认同)
  • “Join(...)”语法允许您指定用于“join”的逻辑。`include(...)` 不会,并且会根据配置的实体之间的关系构建 `join` 语句。 (3认同)
  • 是的,您可以将多个调用链接到"Include()"以沿着不同的"路径"捕获对象.如果您希望对象位于同一路径中,则只需进行一次指定整个路径的调用.由于`LineItems`和`Products`不共享任何路径组件,因此您需要单独调用. (2认同)
  • @Yuck 它是哪种类型的连接? (2认同)

小智 22

我只是想补充说"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框架式-AN-ASP净MVC应用程序


摘自链接页面:

以下是实体框架可以将相关数据加载到实体的导航属性中的几种方法:

懒加载.首次读取实体时,不会检索相关数据.但是,第一次尝试访问导航属性时,将自动检索该导航属性所需的数据.这导致向数据库发送多个查询 - 一个用于实体本身,一个用于实体的相关数据必须被检索.默认情况下,DbContext类启用延迟加载.

渴望加载.读取实体时,将同时检索相关数据.这通常会导致单个连接查询检索所需的所有数据.您可以使用该Include方法指定预先加载.

明确加载.这类似于延迟加载,除了您在代码中显式检索相关数据; 访问导航属性时不会自动执行此操作.通过获取实体的对象状态管理器条目并为集合调用Collection.Load方法或为包含单个实体的属性调用Reference.Load方法,手动加载相关数据.(在下面的示例中,如果要加载管理员导航属性,则替换Collection(x => x.Courses)Reference(x => x.Administrator).)通常,只有在关闭延迟加载时才使用显式加载.

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

  • 欢迎来到SO =)只是一个建议,但当你回答这样的事情时,如果可以,请包含一个代码段.不幸的是,链接可能已经死亡. (2认同)