繁体   English   中英

实体框架中的聚合函数和自引用表

[英]Aggregate functions and self referencing table in Entity Framework

我很难弄清楚如何处理实体框架中的自引用实体和聚合函数。 我的桌子看起来像这样

Task
Id    ParentId    PercentageInParent    CompletedPercentage
0     null        null                  null
1     0           60                    null
2     0           40                    null
3     1           80                    40
4     1           20                    60
5     2           50                    80
6     2           50                    90

PercentageInParent是执行此子任务形式的父级的百分比。 我想查看一个任务,并通过汇总其子元素来知道完成该任务的百分比。

编辑具有子任务的任务(例如任务1)将具有CompletedPercentage = null如果我想知道其CompletedPercentage我想看一下树并计算子任务的完成方式。 在这种情况下,根据任务3和4的完成程度及其在任务1下的权重,可以计算出任务1已完成44%。我如何在EF中查询呢?

您应该添加另一个类来完成所有映射...

public class TaskMap
{
    public string TaskId { get; set; }
    public string TaskParentId { get; set; }
    public virtual Task Task { get; set; }
    public virtual Task ParentTask { get; set; }
}

public class Task
{
    public string TaskId { get; set; }
    public int Progress { get; set; }
    public virtual ICollection<TaskMap> SubTasks { get; set; }
}   

在使用Entity Framework ,您需要更仔细地考虑数据库的设计方式……请记住,这是一个relational数据存储,因此,规范化表单仍然很重要。

在当前设计中,您将始终拥有多个记录,其中ParentId null 这意味着您的设计中有一个重复元素,需要将其提取并放置在单独的表中。

新表TaskMaps应该包含一个复合主键,即TaskId和ParentTaskId。 这将创建您的关系,然后您可以通过实现类似的东西来引用孩子。

var task = this.Context.Tasks.FirstOrDefault(tasks => tasks.TaskId == "random guid")
task.SubTasks.SelectMany(tasks => tasks.SubTasks)
             .Select(sub => sub.Task);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM