我正在尝试通过从 EntityFramework 中获取依赖项来构建依赖关系图。我希望我的查询尽可能高效,所以我不希望提取所有数据。
我有一个多次自我引用的结构,如下所示:
public class PTOPlan
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Allowed { get; set; }
public decimal Taken { get; set; }
public PTOPlan DependentPTO { get; set; }
public PTOPlan RolloverPlan { get; set; }
public int RolloverPlanId { get; set; }
public int DependentPTO { get; set; }
public List<PTOPlanRule> PTOPlanRules { get; set; }
}
后来我们引入了一种更精细的规则创建方式,但出于遗留目的,我们保留了旧结构
public class PTOPlanRule
{
public int Id { get; set; }
public int DepartmentId { get; set; }
public string Name { get; set; }
public decimal Allowed { get; set; }
public decimal Taken { get; set; }
public PTOPlan ParentPTOPlan{ get; set; }
public PTOPlan DependentPTO { get; set; }
public PTOPlan RolloverPlan { get; set; }
public int ParentPTOPlanId { get; set; }
public int RolloverPlanId { get; set; }
public int DependentPTO { get; set; }
}
我需要建立一个依赖关系图。但是有些地方有很多计划,我宁愿不必将数据集拉入内存。
我希望将包含递归地应用于查询,因此它们会提取所有依赖项。例如,我想在 Id 存在时包含依赖项
public Dictionary<int, List<int>> GetPTOPlanDependencyGraph(List<int> ptoPlanIds)
{
var rawPlans = context.PTOPlans.Where(x => ptoPlanIds.Contains(x.Id))
.IncludeWhile(x => x.DependentPTOPlan, x.DependentPTOPlan != null)
.IncludeWhile(x => x.RolloverPlan, x.RolloverPlan != null)
.IncludeWhile(x => x.PTOPlanRules.SelectMany(x => x.DependentPTOPlan), x => x.PTOPlanRules.Any())
return this.BuildDependencyGraph(rawPlans);
}
有没有一种方法可以递归地包含数据,或者有一种方法可以提取我的数据而无需获取额外的计划?