LINQ包含vs加入。它们相等吗?

LINQ包含vs加入。它们相等吗?,linq,Linq,我使用linq中的join连接了两个表。联接和包含之间的区别是什么。从我看来,他们的行为都是一样的 Include vs. Join 从某种意义上说,是的。Include作为联接实现。根据包含链接的可空性,它是内部联接或左联接 您始终可以通过使用联接来构建include,如下所示: db.Users.Select(u => new { u, u.City }) Customer 1 Order Order Order Customer 2 Order

我使用linq中的join连接了两个表。联接和包含之间的区别是什么。从我看来,他们的行为都是一样的

    Include vs. Join

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

您始终可以通过使用联接来构建include,如下所示:

db.Users.Select(u => new { u, u.City })
Customer 1
   Order
   Order
   Order
Customer 2
   Order
   Order

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

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

比较以下各项:
db.客户。包括(“订单”)
生成一个IEnumerable,每个IEnumerable在对象图中可能包含相应的顺序列表,如下所示:

db.Users.Select(u => new { u, u.City })
Customer 1
   Order
   Order
   Order
Customer 2
   Order
   Order
相反,如果对投影到匿名类型的联接执行相同操作,则可以得到以下结果:

来自数据库中的c客户
在c.CustomerId上的db.Orders中加入o等于o.CustomerId
选择新的{c,o}
这将生成一个新的
IEnumerable
,其中客户将为每个订单重复

{ Customer1, orderA }
{ Customer1, orderB }
{ Customer1, orderC }
{ Customer2, orderD }
{ Customer2, orderE }
{ Customer2, orderF }

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

如果您只是需要一些
客户的所有
订单
。博客应用程序的一个很好的例子是总是在
文章的下方显示所有
评论。那么
Include
就是你的工作方式

如果您需要一些
客户
,并使用
订单
实体中包含的一些数据过滤掉他们,那么
反向加入
会更有帮助。例如,您希望对
文章
进行分类,以便将
文章
评论
一起发送给警方,其中包含粗俗的词语


此外,如果您的
订单
实体包含大量数据(许多列),占用大量内存,并且您不需要所有数据,那么
加入
可能会更有效,但这里始终存在一个问题,即“大量数据”或“许多列”是什么意味着首先测试将是最佳选择。

但是结果是否相同,以及何时建议使用.Include vs a join是否有人可以在linqtosql vs Include之后添加实际的T-sql查询?希望在数据库中看到t-sql查询,谢谢!我做实体框架已经有几个月了,有人能让答案更容易理解吗?谢谢,我认为@Jim Wooley的意思是使用Join或Include取决于您想要获得的结果类型。@user8280126,不幸的是,实际的TSQL查询取决于EF的提供程序和版本。它在EF core的每个版本之间都发生了变化,例如直到3.x版本,而1.x版本实际上在执行延迟求值,即使延迟加载直到2.x版本才启用,所以在这里向您显示SQL并不简单,我的评论重点更多地是结果对象形状,而不是生成的SQL语句。您好,您能看一下吗?这是关于你在回答中说的话。