【问题标题】:LINQ Entity Framework 4 SELECT COUNT LEFT OUTER JOIN IN GROUP BYLINQ Entity Framework 4 SELECT COUNT LEFT OUTER JOIN IN GROUP BY
【发布时间】:2013-06-29 14:32:36
【问题描述】:

使用 LINQ to Entities 在给定父 ID 列表的情况下,我无法获取子对象的计数。以下是我在直接 SQL 中的做法:

SELECT COUNT(Child.ParentId) ,Parent.Parentd
FROM Parent
LEFT OUTER JOIN Child ON Child.ParentId = Parent.ParentId
WHERE
    Parent.ParentId IN (
        8417
        ,118458
        ,120567
        ,121596
        )
GROUP BY Parent.ParentId

这是我在 LINQ to Entities 中尝试过的:

var counts = from Parent in context.Parents
    join Child in context.Children on Parent.ParentId equals Child.ParentId 
    into children
    from jn in children.DefaultIfEmpty()
    where iEnumerableParentIds.Contains(parent.parentId)
    group parent by parent.parentId
    into g
    select new {count = g.Count(), parentId = g.Key};

这非常接近,但我计算的是分组的父级而不是子级,当父级没有子级时,我的计数为 1。

【问题讨论】:

  • 您的Parent 实体是否有“导航属性”,例如Children 属性?
  • 没有。这个项目是一个“数据优先”的设置,没有正式的 sql 外键关系设置。我们从未在数据库上设置外键,因为我们知道存在无法从子表中消除的孤儿
  • 看起来答案可能就在这里:stackoverflow.com/questions/695506/…现在试试...
  • 旧问题的答案有效

标签: linq entity-framework


【解决方案1】:

我认为您必须在此处更改grouping 来源:

             group new { parent, jn } by parent.parentId
             into g
             select new {count = g.Select(x => x.jn).Count(), parentId = g.Key};

【讨论】:

    【解决方案2】:

    var counts = from Parent in context.Parents 在 context.Children 中加入 Child 在 Parent.ParentId 上等于 Child.ParentId 变成孩子 其中 iEnumerableParentIds.Contains(parent.parentId) 选择新的 {count = children.Count(), parentId = Parent.ParentId};

    没有测试(从我的 iPod 响应;)),我很确定这会给你想要的结果。我不记得我到底做了什么,但我认为这应该有效。基本上,您已经对联接进行了分组,因此您不必再次对所有内容进行分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 2020-05-17
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多