2015-05-13 44 views
0

我很難搞清楚如何處理實體框架中的自引用實體和聚合函數。我的表看起來像這樣實體框架中的聚合函數和自引用表

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就是個父執行此子任務的形式。我想看看一個任務,並通過總結其子元素知道它的完成百分比。

編輯 有孩子的任務將有CompletedPercentage = null如果我想知道一個任務(例如,任務1)其CompletedPercentage我想往下看樹和計算子任務是如何完成的。在這種情況下,任務1完成任務3和4完成的距離以及他們在任務1下的重量的44%完成計算。我如何在EF中查詢?

+0

究竟是什麼問題? – Kamo

回答

1

您應該添加另一個類,做所有的繪圖...

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); 
+0

感謝您的回答。我已經對錶格提出了建議,以便我有任務和子任務。請你看看我編輯的問題 –

+0

遇到任何問題嗎? –

+0

子任務可以有子任務,這是我的問題真的。儘管如此,我可以將子任務限制在一定深度。 –