45

我在 linq 中使用 join 来加入 2 个表。加入和包含有什么区别。据我所知,他们的行为都是一样的。

    Include vs. Join
4

3 回答 3

49

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 }

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

于 2012-09-05T18:22:44.460 回答
15

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

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

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

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

于 2012-09-05T15:27:36.973 回答
4

如果您只需要Orders一些Customers. 博客应用程序的好例子总是Comments在下面显示Articles。然后Include是你的工作方式。

Join如果您需要一些并使用实体Customers中包含的一些数据过滤掉它们,则相反会更有帮助。Orders比如你想整理出含有粗俗词语的报警ArticlesArticlesComments

此外,如果您的Orders实体包含大量数据(许多列)占用大量内存并且您不需要所有这些数据,那么join效率会更高,但这里总是有一个问题,即“大量数据”或“多列”是什么意味着所以先测试将是最好的选择。

于 2020-08-31T04:45:57.900 回答