将分组计数添加到 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中看到的内容。
我有以下字段(显然是实际域的简化版)
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中看到的内容。