我在linq中使用了join来加入2个表。 join和Include之间有什么区别。从我看来,它们都表现得一样。
Include vs. Join
答案 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
可能会效率更高,但是这里总是一个问题,“大量数据”或“许多列”是什么意思,因此首先进行测试将是最佳选择。