我需要找到给定父母列表的所有后代。查询(使用纯 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:如何在无字段上连接,即笛卡尔连接
做了更多挖掘并找到了以下解决方案
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;
这会生成 SQL-Server 交叉联接查询,并允许在查询 where 子句中使用
IsDescendantOf()
。