我尝试进行了大量研究,但我更像是数据库专家-因此,即使MSDN中的解释对我也没有任何意义。谁能解释一下,并提供一些示例Include()
说明在SQL
查询期间执行什么语句?
Answers:
举例来说,假设您要获取所有客户的列表:
var customers = context.Customers.ToList();
并假定每个Customer
对象都有对其的集合的引用Orders
,并且每个对象都有对的引用,这些Order
引用LineItems
也可以引用a 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;
LineItems
和Products
,LINQ查询应该是这样的:var customersWithOrderDetail = context.Customers.Include("Orders").Include("LineItems").Include("Products").ToList();
?
Include()
沿不同的“路径”捕获对象。如果要使对象位于同一路径中,则只需进行一次调用即可指定整个路径。由于LineItems
并且Products
不共享任何路径组件,因此您确实需要单独的调用。
我只是想补充一点,“包含”是渴望加载的一部分。Microsoft在Entity Framework 6教程中对此进行了描述。这是链接:https : //docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the asp-net-mvc应用程序中的实体框架
摘录自链接页面:
实体框架可以通过以下几种方式将相关数据加载到实体的导航属性中:
延迟加载。首次读取实体时,不会检索相关数据。但是,第一次尝试访问导航属性时,将自动检索该导航属性所需的数据。这导致将多个查询发送到数据库-一个查询实体本身,而每次必须检索该实体的相关数据时。DbContext类默认情况下启用延迟加载。
渴望加载。读取实体时,将同时检索相关数据。通常,这会导致单个联接查询,该查询检索所需的所有数据。您可以使用
Include
方法指定紧急加载。显式加载。这类似于延迟加载,不同之处在于您可以通过代码显式检索相关数据。访问导航属性时,它不会自动发生。您可以通过获取实体的对象状态管理器条目并为集合调用Collection.Load方法或为拥有单个实体的属性调用Reference.Load方法来手动加载相关数据。(在下面的示例中,如果要加载Administrator导航属性,请替换
Collection(x => x.Courses)
为Reference(x => x.Administrator)
。)通常,只有在关闭惰性加载后,才使用显式加载。由于它们不会立即检索属性值,因此延迟加载和显式加载也都称为延迟加载。