【发布时间】:2021-06-21 12:49:28
【问题描述】:
我们使用EFCore.SqlServer.HierarchyId 来表示我们数据中的层次结构。
我的目标是返回具有不确定长度的特定路径的对象的后代,例如给定一棵树的层次结构为 1->2->3->4,路径 1/2/3 将返回 4
知道路径的长度,我可以这样查询:
var collections = await context.Collections.Where(c => c.CollectionHierarchyid.IsDescendantOf(
context.Collections.FirstOrDefault(c1 => c1.FriendlyId == "three" &&
context.Collections.Any(c2 => c2.CollectionHierarchyid == c1.CollectionHierarchyid.GetAncestor(1) && c2.FriendlyId == "two" &&
context.Collections.Any(c3 => c3.CollectionHierarchyid == c2.CollectionHierarchyid.GetAncestor(1) && c3.FriendlyId == "one")
)
).CollectionHierarchyid
)).ToListAsync();
但是如果路径的长度未知,你会怎么做呢?我不能从表达式中调用递归函数,因为它不会从 Linq 编译到 Entity Sql。
我知道答案在于使用 System.Linq.Expressions 构建表达式,但我不确定从哪里开始。
【问题讨论】:
标签: entity-framework-core linq-expressions hierarchyid