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