【问题标题】:How can I set a property on every ancestor item on a tree branch?如何为树枝上的每个祖先项设置属性?
【发布时间】:2020-06-10 19:17:24
【问题描述】:

我正在做一个简单的项目管理系统,我有一个项目的模型:

public class Project
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Title { get; set; }
    public string Notes { get; set; }
    public DateTime Created { get; set; }
    public DateTime? Deadline { get; set; }
    public bool Completed { get; set; }

    public List<Project> ChildProjects { get; set; }
}

OnModelCreating()中是这样定义的:

modelBuilder.Entity<Project>()
    .HasMany(c => c.ChildProjects)
    .WithOne()
    .HasForeignKey(p => p.ParentId);

如果需要更改,我想要一些功能来更改所有祖先项目的Completed-property。 IE。如果特定父项目的所有同级子项目都设置为已完成,则父项目的Completed-属性应自动设置为true。然后对祖父母、曾祖父母等进行相同的检查。

这就是我所拥有的:

在创建或更新子项目时,我也在这样做:

// "project" is the current project we are creating or updating.
if (project.ParentId != null)
{
    List<Project> allProjects = await db.Projects.ToListAsync();
    List<Project> siblings = allProjects.Where(s => s.ParentId == project.ParentId).ToList();
    SetParentCompleteness(allProjects, project.Id, siblings.All(c => c.Completed));
    db.UpdateRange(allProjects);
}

SetParentCompleteness()-方法:

private void SetParentCompleteness(List<Project> allProjects, int id, bool completed)
{
    Project project = allProjects.Where(p => p.ParentId == id).FirstOrDefault();
    if (project != null)
    { 
        project.Completed = completed;
        db.Update(project);
        SetParentCompleteness(allProjects, project.Id, completed);
    }
    return;
}

我知道UpdateRange(the_entire_database) 不是一个好主意。如何列出需要更改的项目?

【问题讨论】:

  • 似乎是合理的逻辑,但你为什么要写db.Projects.ToList() 这是一个非常糟糕的主意。不要做那么多急切的评价。此外,你可以得到这样的兄弟姐妹。 project.Parent.Children 这要简单得多。你需要延迟加载
  • @AluanHaddad 如果我想要数据库中的所有项目,db.Projects.ToListAsync() 的替代方案是什么?
  • 您不需要全部,只需要与正在更新的项目相关的那些

标签: c# recursion tree asp.net-core-mvc


【解决方案1】:

让我们将逻辑分解为 3 个部分。

第 1 部分:您要查询所有相关项目(您的树)。为此,是的,您想从数据库中加载所有项目,但实际上,您只需要加载 ProjectID、ParentID 和状态。您不需要加载整个实体(以防您的项目实体有很多列)。

第 2 部分:更改所有查询项目的状态。对于那些加载的 ID,现在,您可以加载所有需要的项目(这次是整个实体)并更改状态。

第 3 部分:所有项目的批量更新。您可以使用这样的东西 (https://entityframework-extensions.net/bulk-update) 来优化更新性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多