LINQ Include vs Join。它们是等价的吗?

时间:2012-09-05 15:21:42

标签: linq

我在linq中使用了join来加入2个表。 join和Include之间有什么区别。从我看来,它们都表现得一样。

    Include vs. Join

3 个答案:

答案 0 :(得分:30)

包含旨在保留原始对象结构和图形。需要使用Join来投影对象图的展平表示,或者通过图表连接不自然相关的类型(即,将客户的城市与运输设施的城市联系起来)。

比较以下内容: db.Customers.Include("Orders") 生成如下对象图:

Customer
   Order
   Order
   Order

相比之下,如果您使用投射到匿名类型的联接执行相同操作,则可以获得以下内容:

from c in db.Customers 
join o in db.Orders on c.CustomerId equals o.CustomerId 
select new {c, o}

// produces new Anonymous<Customer, Order> 

虽然两者都可以向数据库发出相同的请求,但结果类型可能完全不同。

答案 1 :(得分:11)

从某种意义上说,是的。 Include实现为连接。根据所包含链接的可为空性,它是内部或左侧连接。

您始终可以使用联接自行构建包含,如下所示:

db.Users.Select(u => new { u, u.City })

这是用户所在城市的“包含”。它表现为SQL连接。

答案 2 :(得分:0)

如果您仅需要Orders的全部Customers。博客应用程序的一个很好的示例是始终显示Comments下的所有Articles。那么Include是您的工作方式。

如果您需要一些Join并使用Customers实体中包含的某些数据将其过滤掉,相反的

Orders会更有用。例如,您想整理Articles并发送给Articles的警察,其中Comments包含低俗单词。

如果您的Orders实体包含大量占用大量内存的数据(许多列),而您又不需要所有这些数据,那么join可能会效率更高,但是这里总是一个问题,“大量数据”或“许多列”是什么意思,因此首先进行测试将是最佳选择。