Sql 确定哪些树节点是lazy load WCF REST API中的叶子

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)非常简单。我遇到的是需要识别哪些节点

使用: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)非常简单。我遇到的是需要识别哪些节点是叶节点。(注意:我已经从下面的代码中删除了所有错误处理、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