使用ef-core获取父-子表的递归rootID



我有一个sql表,它是构建像一个树列表(父/子)。意味着你有rootId和childdid。每个实体都有一个ParentId。如果ParentId为空,则该元素是根元素。

下面是一个层次结构的例子

- Fruit (1)
- TreeFruits (2)
- Apple (4)
- Bulb (5)
- SeaFruits (3)
- DeepSeaFruits (6)
- Sushi (9)
- Kraken (13)
- Shrimp (7)
- Fish (8)
- Vegetable (10)
- Carrot (11)
- Potato (12)

您可以看到每个根元素(编号1和10)至少有1个子元素。但是元素的深度大小是未知的。

下面是一个表的示例

------------
| Id*      |<---
|          |   |
| ParentId |----
| Name     |
------------

我的任务是查询(使用EntityFramework Core)给定水果的RootId。当然,我可以从数据库加载所有实体,并在内存中做,但这是不聪明的。你知道我如何写我的Linq,这个任务发生在数据库上吗?

如果您不想从数据库加载所有记录然后处理它们,您有两个选择:

  • 解决方案1:编写存储过程并在数据库中进行处理。

  • 解决方案2:编写递归函数,向数据库发送多个请求(根深度的数量)

下面是解决方案2的函数:

public async Task<int> GetRoot(int id)
{
var current = await _dbContext.Set<Entity>().Where(p => p.Id == id).FirstOrDefaultAsync();
if (current.ParentId is not null)
{
return await GetRoot(current.ParentId.Value);
}
else
{
return current.Id;
}
}

最新更新