【发布时间】:2012-09-05 15:21:41
【问题描述】:
我在 linq 中使用了 join 来连接 2 个表。加入和包含有什么区别。在我看来,它们的行为都是一样的。
Include vs. Join
【问题讨论】:
-
据我所知请详细说明。我认为在 LINQ 查询中使用这两个语句将清楚地表明它们有多么不同。
标签: linq
我在 linq 中使用了 join 来连接 2 个表。加入和包含有什么区别。在我看来,它们的行为都是一样的。
Include vs. Join
【问题讨论】:
标签: linq
Included 旨在保留原始对象结构和图形。需要一个 Join 来投影对象图的扁平表示或连接通过图不自然相关的类型(即,将客户的城市与运输设施的城市连接起来)。
比较以下:
db.Customers.Include("Orders")
生成一个 IEnumerable,每个 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。博客应用程序的一个很好的例子是始终在Articles 下方显示所有Comments。那么Include 就是你的工作方式。
如果您需要一些Customers 并使用Orders 实体中包含的一些数据过滤掉它们,则相反的Join 会更有帮助。比如你想整理Articles报警Articles与Comments包含粗俗的词。
此外,如果您的 Orders 实体包含大量数据(很多列)占用大量内存并且您不需要所有这些数据,那么 join 可能会更高效,但这里总是有一个问题“大量数据”或“多列”表示因此首先测试将是最佳选择。
【讨论】: