簡體   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