首页 > 解决方案 > c#如何递归删除对象及其子对象

问题描述

这是我的函数,它根据 parentId 给我一个节点列表:

public List<RepositoriesListViewModel> GetChildren(string ParentId)
{
    List<RepositoriesListViewModel> data = new List<RepositoriesListViewModel>();
    List<RepositoriesListViewModel> initialData = new List<RepositoriesListViewModel>();
    var List = dbContext.Repositories.ToList();
    foreach (var item in List)
    {
        initialData.Add(new RepositoriesListViewModel
        {
            id = item.Id,
            parent = item.ParentId,
            ApplicationsId = item.ApplicationsId,
            text = item.Name,
            Path = item.Path,
            CreatedOn = item.CreatedOn
        });
    };
    foreach (RepositoriesListViewModel child in initialData.Where(x => x.parent == ParentId))
    {
        child.Children = GetChildren(child.id);
        data.Add(child);
    }
    return data;
}

我想知道是否也可以使用此功能删除项目及其子项?我将在哪里添加我的删除调用?

这就是我的删除调用的样子:

public void Delete(string Input)
{
    try
    {
        var repo = Get(Input);
        dbContext.Repositories.Remove(repo);
        dbContext.SaveChanges();
        logger.LogInformation(LoggingGlobals.Delete + " Repository: " + repo.Name);
    }
    catch (Exception e)
    {
        logger.LogError(e, "Failed to delete Repository");
    }
}

标签: c#asp.netasp.net-mvc

解决方案


看来你想要这样的东西:

public void Delete(string Input)
{
    try
    {
        var children = GetChildren(Input);

        foreach(var child in children)
        {
            Delete(child.Id);
        }

        var repo = Get(Input);
        dbContext.Repositories.Remove(repo);
        dbContext.SaveChanges();
        logger.LogInformation(LoggingGlobals.Delete + " Repository: " + repo.Name);
    }
    catch (Exception e)
    {
        logger.LogError(e, "Failed to delete Repository");
    }
}

因此,在删除项目本身之前,首先要删除其子项及其子项。


推荐阅读