最近有项目需要加载大型树数据,数据大概3W条
后端使用C# NET6
前端使用Vue3 elementuiplus 虚拟tree =》解决大型树数据加载
遇到的问题是后端在检索数据时,要返回匹配数据的完整树目录
1.因为单条数据没有存放完整路径,需要通过父级ID逐级查找组装,导致性能急剧下降
2.数据包数据20M左右,前端下载受带宽影响也变慢
下面来说问题1
采用BOM树缓存,筛选时使用Queue来处理遍历数据加载符合条件的树数据如下
/// <summary>
/// 过滤与重建树数据
/// </summary>
/// <param name="tree"></param>
/// <param name="predicate"></param>
/// <param name="qualifiedNodes"></param>
/// <returns></returns>
public static List<BOM_DetailTree> FilterAndRebuildTreeOptimized(List<BOM_DetailTree> tree, Func<BOM_DetailTree, bool> predicate, HashSet<long> qualifiedNodes)
{
var result = new List<BOM_DetailTree>();
// 使用队列来处理树的广度优先遍历
var queue = new Queue<(BOM_DetailTree Node, List<BOM_DetailTree> Result)>();
queue.Enqueue((tree.FirstOrDefault(n => n.ParentID == null || n.ParentID == 0), result));
//while (stack.Count > 0)
while (queue.Count > 0)
{
var (currentNode, currentResult) = queue.Dequeue();
// 如果当前节点满足条件或其子节点中有满足条件的,添加到结果树