【问题标题】:I can't understand GroupJoin where i will need it in database relationships我无法理解在数据库关系中需要它的 GroupJoin
【发布时间】:2010-06-12 22:05:47
【问题描述】:

我想用 5-6 个小时来了解有关 GroupJoin 的一些信息。我正在谈论使用 linq 查询数据库表。我了解 Join 和 GroupJoin 的作用,但我真的不明白我将在哪里需要它。我觉得 Join 做了我需要的所有事情,但如果有什么 Join 可以'没有 GroupJoin,所以我觉得这种情况毫无意义或无用。

例如:

与 Phones 和 Phones 表相关的 Persons 表包含 Persons 的外键,一个人可以多拥有一个电话号码。如果我们想带上所有有电话号码但没有电话号码的人,那么我们将需要 GroupJOin 但我们需要这个查询做什么?

你能给我使用 GroupJoin 的充分理由、例子或解释吗?

【问题讨论】:

    标签: c# .net linq join


    【解决方案1】:

    来自 MSDN:

    在关系数据库术语中,Join 实现了内部联接,这是一种仅返回在其他数据集中具有匹配项的对象的联接类型。 GroupJoin 方法在关系数据库术语中没有直接等价物,但它实现了内连接和左外连接的超集。

    因此,如果您曾经有理由在 SQL 中使用外连接,您可能会在 Linq 中将 GroupJoin 用于类似目的。

    【讨论】:

      【解决方案2】:

      在 SQL 中,你会写:

      SELECT *
      FROM Persons p LEFT JOIN Phones ph on p.PersonID = ph.PersonID
      

      您会得到一个行列形状,其中一些行的电话号码为空,而一些行的 Person 与其他行相同。

      Bob, null
      Joe,  111-1111
      Mike, 222-2222
      Mike, 333-3333
      Mike, 444-4444
      

      在 LinqToSql 中,你会写:

      from p in Persons
      join ph in Phones on p.PersonID equals ph.PersonID into phones
      select new {Person = p, Phones = phones.ToList()};
      

      您将获得每个人一个人实例和每个电话一个电话实例,所有这些都正确相关。

      Bob, [] <- (empty)
      Joe, [111-1111]
      Mike, [222-2222, 333-3333, 444-4444]
      

      【讨论】:

      • 每人只有一个人实例是很好的解释。现在我明白了。如果我们使用just join,我们有时可以为一个人再获得一个实例,而且我们不会得到所有人的名单吗?这一次我的脑海中出现了另一个问题。为什么我们需要这个查询?不是没有意义吗?如果我们想看到有电话的人有手段。如果我们想看到没有电话号码的人也有手段。但是查询所有人是否有电话号码没有任何意义对我来说。即使询问所有人对我来说也有意义。这是我仍然无法理解的
      • 从Database IO/plan上group join的意思相当于left join。左连接不是没有意义的。就结果形状而言,组连接的含义与左连接有很大不同。在对象世界中 - 分层结果形状对于数据凝聚力通常很重要,这与数据世界不同,在数据世界中,结果行具有来自所有相关列的属性。
      • 如果你没有马上得到它,没关系。当我学习 Linq 时,GroupJoin 也让我陷入了困境。
      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 2015-10-23
      • 2011-01-13
      • 1970-01-01
      • 2016-07-31
      • 2014-02-28
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多