【问题标题】:LINQ Include vs Join. Are they equivalent?LINQ 包含与加入。它们是等价的吗?
【发布时间】:2012-09-05 15:21:41
【问题描述】:

我在 linq 中使用了 join 来连接 2 个表。加入和包含有什么区别。在我看来,它们的行为都是一样的。

    Include vs. Join

【问题讨论】:

  • 据我所知请详细说明。我认为在 LINQ 查询中使用这两个语句将清楚地表明它们有多么不同。

标签: linq


【解决方案1】:

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 vs a join
  • 有人可以在 linqtosql vs Include 后面添加实际的 T-sql 查询吗?希望在数据库中查看 t-sql 查询,谢谢!
  • 我正在做实体框架几个月,有人可以让答案更容易理解吗?谢谢,
  • 我认为@Jim Wooley 的意思是使用 Join 或 Include 取决于您想要获得的结果类型。
  • @user8280126,不幸的是,实际的 TSQL 查询取决于 EF 的提供者和版本。它在 EF 核心的每个版本之间发生了变化,例如直到 3.x 和 1.x 实际执行延迟评估,即使延迟加载直到 2.x 才启用,所以在这里向您展示 SQL 和我的观点并不简单与生成的 SQL 语句相比,评论更多的是关于生成的对象形状。
【解决方案2】:

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

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

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

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

【讨论】:

【解决方案3】:

如果您只是需要所有Orders 来获得一些Customers。博客应用程序的一个很好的例子是始终在Articles 下方显示所有Comments。那么Include 就是你的工作方式。

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

此外,如果您的 Orders 实体包含大量数据(很多列)占用大量内存并且您不需要所有这些数据,那么 join 可能会更高效,但这里总是有一个问题“大量数据”或“多列”表示因此首先测试将是最佳选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 2019-09-25
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2021-09-06
    相关资源
    最近更新 更多