I need to find all descendants for a given list of parents. The query (in plain SQL) was easy enough, but I can't translate it into LINQ-to-SQL.
SQL Query:
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') Here my (flawed) LINQ query:
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; The IDE complains about the use of parent - I believe this is related to how the LINQ-to-SQL queries need to be structured 🤔.
This SO article describes the SQL side of the problem a bit more detailed, but again I do need to express my query with LINQ. Linq to SQL: How to join on no field i.e. cartesian join


join..on..equalsclause doesn't have access to both enumerators simultaneously, it rather computes a key for each collection before independent of one another. What you want is a secondfromclause followed by awhere. Iefrom parent in Context.GlobalDocumentClassification where child.HierarchyId.IsDescendantOf(child.HierarchyId). Remember LINQ is not SQL and the worst way of learning it is trying transliterate an existing SQL queryfrom child in Context.GlobalDocumentClassification where Context.GlobalDocumentClassification.Any(parent => child.HierarchyId.IsDescendantOf(parent.HierarchyId)) ....