Sql 确定哪些树节点是lazy load WCF REST API中的叶子
使用:SQL Server 2008,WCF 4 REST,EF 我有一个表示树的邻接列表表Sql 确定哪些树节点是lazy load WCF REST API中的叶子,sql,wcf,linq,entity-framework,common-table-expression,Sql,Wcf,Linq,Entity Framework,Common Table Expression,使用:SQL Server 2008,WCF 4 REST,EF 我有一个表示树的邻接列表表 TABLE Category ( CatId int IDENTITY(1,1) NOT NULL PRIMARY KEY, ParentId int NULL, Name nvarchar(50) NOT NULL ) 我正在创建一个WCF REST API,以允许客户端以延迟加载方式构建树。执行查询以获取节点的子节点(下面的nodeid)非常简单。我遇到的是需要识别哪些节点
TABLE Category
(
CatId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentId int NULL,
Name nvarchar(50) NOT NULL
)
我正在创建一个WCF REST API,以允许客户端以延迟加载方式构建树。执行查询以获取节点的子节点(下面的nodeid)非常简单。我遇到的是需要识别哪些节点是叶节点。(注意:我已经从下面的代码中删除了所有错误处理、count=0处理、null处理等)
有什么想法吗?对于这个查询,我可以使用一个存储过程,并且考虑过使用CTE,但是我不想在整个树中递归,只需要获取指定节点的子节点
编辑(1月20日上午10:40)
我决定修改DB模式,添加“IsLeaf”位列。然后我做了相应的更新来设置IsLeaf——这意味着我不必在运行时动态地计算它。也许效率更高,但我还是很好奇我会怎么做。请告知。LINQ中没有递归函数(还没有?)。因此,虽然在MSSQL中有点简单,但在LINQ中,我建议执行以下操作(伪代码): 正如你所看到的,它是LINQ和C的组合。此外,在执行所有这些操作之前,可能值得将表的内容放在本地 此外,如有必要,您可能需要更新algo以检查循环
tree = _context.Categories
.Where(c => c.ParentId == nodeid)
.Select(p => new TreeNode
{
id = p.CatId,
parentId = p.ParentId ?? -1, // -1 = NULL in data struct
name = p.Name,
isleaf = true // how to figure this out?
}).ToList();
// These two lines is one LINQ statement
level = select all root nodes (ParentID == NULL)
add level nodes to result
// C# loop
while level is not empty
// The loop body except for the assignment in the end is one LINQ statement
next = select all nodes that have parentId in level
for each node in next
find parent node
add to result with updated parent info
// C# assignment
level = next