c # Как рекурсивно удалить объекты и их потомки - PullRequest
1 голос
/ 06 апреля 2019

Это моя функция, которая дает мне список узлов на основе его 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");
    }
}

1 Ответ

1 голос
/ 23 апреля 2019

Кажется, вы хотите что-то вроде этого:

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");
    }
}

Итак, прежде чем удалить сам элемент, вы сначала удаляете его дочерние элементы и их дочерние элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...