将分组计数添加到 Linq 查询

Adding Grouped Count to Linq Query

我有以下字段(显然是实际域的简化版)

MyEntity.ID,
MyEntity.Title,
MyEntity.ParentID,
MyEntity.RootID,
MyEntity.IsOpen

如果没有 parent 的实体生成 child,ParentID 将设置为 parent 实体的 ID,RootID 将设置为相同。如果那个 child 然后生成一个 child 那么它的 child 的 parentID 是直接 parent 的 ID,但是 Root 是长子,所以:

ID     Title     ParentID     RootID    IsOpen
1      One       NULL         NULL      True
2      Two       1            1         False
3      Three     2            1         True
4      Four      NULL         NULL      True

我想要一个查询,它将 return 每个实体的 ID 和标题,加上一个布尔值,如果该实体是开放的并且有任何其他相关的开放实体。

所以对于以上table我希望看到

ID     Title    IsOpenAndHasHasOpenRelations
1      One      True
2      Two      False
3      Three    True
4      Four     False

IsOpenAndHasHasOpenRelations 列同样可以只是对打开关系数的计数

逻辑基本上是——假设实体是开放的,它有parent吗?如果不是,那么它的 children 是否有任何开放实体?如果它确实有一个 parent 是否有任何共享到同一个根的开放实体?

虽然我正在努力将其作为 Linq to Entities Expression 来执行。有人可以帮忙吗?

编辑。这是我试图移动到 LINQ 的(略有修改的)当前 SQL:

WITH PageIndex AS (
SELECT *
FROM EntityTable) 
SELECT 
[PageIndex].*   
,CAST (CASE 
    WHEN EntityRecord.IsOpen = THEN 0
    WHEN EntityRecord.[RootID] IS NOT NULL THEN
        CASE
        WHEN ( SELECT COUNT(ID) FROM EntityTable AS rootEntity
            WHERE rootEntity.[ID] = PageIndex.[RootID]
            AND (rootEntity.IsOpen = 1)
            ) > 0 THEN 1
            ELSE 0
        END
    ELSE
        CASE
        WHEN ( SELECT COUNT(*) FROM EntityTable AS upissue
            WHERE upissue.RootID = PageIndex.[ID]
            AND (upissue.IsOpen = 1)
            ) > 0 THEN 1
            ELSE 0
        END
END AS BIT) AS IsMultipleLinkexEntitiesOpen
FROM PageIndex

此处 LinQ 中的逻辑完全相同:

var res = DBcontext.EntityTable.Select(x => new
                {
                    ID = x.ID,
                    Title = x.Title,
                    IsOpenAndHasHasOpenRelations = x.IsOpen ? false
                    : x.RootID != null ? DBcontext.EntityTable.Any(y => y.ID == x.RootID && y.IsOpen)
                    : (DBcontext.EntityTable.Any(y => y.ID == x.RootID && y.IsOpen))
                });

如果您拥有自己的实体外键,它会变得更干净。

我仍然无法理解你的全部逻辑,我只是​​翻译我在SQL中看到的内容。