HierarchyID:使用 LINQ-to-SQL 获取父级列表的所有后代

问题描述 投票:0回答:1

我需要找到给定父母列表的所有后代。查询(使用纯 SQL)很简单,但我无法将其转换为 LINQ-to-SQL。

SQL查询:

select child.id from GlobalDocumentClassification child 
  inner join GlobalDocumentClassification parent 
on child.HierarchyId.IsDescendantOf(parent.HierarchyId) = CAST(1 AS bit) and 
  parent.Id in ('5bb9450f-3778-411d-bbf2-5a5775c70310')

这是我的(有缺陷的)LINQ 查询:

var entityIds =
    from child in Context.GlobalDocumentClassification
    join parent in Context.GlobalDocumentClassification
        on child.HierarchyId.IsDescendantOf(child.HierarchyId) equals true
    where EF.Constant(documentClassificationIds).Contains(parent.Id)
        select child.Id;

IDE 抱怨

parent
的使用 - 我相信这与需要如何构造 LINQ-to-SQL 查询有关 🤔。

这篇 SO 文章更详细地描述了问题的 SQL 方面,但我仍然需要使用 LINQ 表达我的查询。 Linq to SQL:如何在无字段上连接,即笛卡尔连接

非常感谢您的帮助 code

c# linq-to-sql
1个回答
0
投票

做了更多挖掘并找到了以下解决方案

var selfJoin = 
    from child in Context.GlobalDocumentClassification
    from parent in Context.GlobalDocumentClassification
    select new { child, parent };

var query = from item in selfJoin
    where item.child.HierarchyId.IsDescendantOf(item.parent.HierarchyId) &&
        EF.Constant(ids).Contains(item.parent.Id)
    select item.child.Id;

code

这会生成 SQL-Server 交叉联接查询,并允许在查询 where 子句中使用

IsDescendantOf()

© www.soinside.com 2019 - 2024. All rights reserved.