[英]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.