我在 linq 中使用 join 来加入 2 个表。加入和包含有什么区别。据我所知,他们的行为都是一样的。
Include vs. Join
Included 旨在保留原始对象结构和图形。需要一个 Join 来投影对象图的扁平表示或连接通过图不自然相关的类型(即,将客户的城市与运输设施的城市连接起来)。
比较以下内容:
db.Customers.Include("Orders")
生成一个 IEnumerable,其中每个都可以在对象图中包含其对应的 Orders 列表,如下所示:
Customer 1
Order
Order
Order
Customer 2
Order
Order
相反,如果您对投影到匿名类型的连接执行相同操作,您可以获得以下结果:
from c in db.Customers
join o in db.Orders on c.CustomerId equals o.CustomerId
select new {c, o}
这会产生一个新IEnumerable<Anonymous<Customer, Order>>
的客户为每个订单重复的地方。
{ Customer1, orderA }
{ Customer1, orderB }
{ Customer1, orderC }
{ Customer2, orderD }
{ Customer2, orderE }
{ Customer2, orderF }
虽然两者都可能向数据库发出相同的请求,但结果类型可能完全不同。
从某种意义上说,是的。Include 被实现为连接。根据所包含链接的可空性,它是内连接或左连接。
您始终可以使用联接自己构建包含,如下所示:
db.Users.Select(u => new { u, u.City })
这是用户所在城市的“包含”。它表现为 SQL 连接。
如果您只需要Orders
一些Customers
. 博客应用程序的好例子总是Comments
在下面显示Articles
。然后Include
是你的工作方式。
Join
如果您需要一些并使用实体Customers
中包含的一些数据过滤掉它们,则相反会更有帮助。Orders
比如你想整理出含有粗俗词语的报警Articles
。Articles
Comments
此外,如果您的Orders
实体包含大量数据(许多列)占用大量内存并且您不需要所有这些数据,那么join
效率会更高,但这里总是有一个问题,即“大量数据”或“多列”是什么意味着所以先测试将是最好的选择。