要获得父子关系,我使用递归,
public List<MasterDiagnosi> GetAllDiagonsis()
{
IEnumerable<MasterDiagnosi> list = this.GetMasterDiagnosi();
List<MasterDiagnosi> tree = new List<MasterDiagnosi>();
var Nodes = list.Where(x => x.DiagnosisParentID == 0 && x.Status == 2 && x.DiagnosisLanguageID == 2);
foreach (var node in Nodes)
{
SetChildren(node, list);
tree.Add(node);
}
return tree;
}
private void SetChildren(MasterDiagnosi model, IEnumerable<MasterDiagnosi> diagonisList)
{
var childs = diagonisList.Where(x => x.DiagnosisParentID == model.DiagnosisID && x.Status == 2 && x.DiagnosisLanguageID == 2);
if (childs.Count() > 0)
{
foreach (var child in childs)
{
SetChildren(child, diagonisList);
model.MasterDiagnosis.Add(child);
}
}
}
它适用于0-500条记录,但如果我有超过5k或10k的记录,那么我最终处理了4-5分钟的最坏情况。我正在寻找另一种方式,或任何优化。目前我使用cahce保存我的一天,但我需要这样做,因为可能会进行各种CRUD操作。任何帮助?
答案 0 :(得分:1)
我建议将树数据结构保存在关系数据库中。在这个presentation of advanced data structures中,您可以找到一些可以有效地用于在数据库中存储树的数据结构。其中一些很简单。
我必须提醒您,这些结构并不总是易于实施。但是,性能的提升可能很大。
我使用了nested set model,我发现效率非常高。这当然取决于您的特定树导航方案。正如Evan Petersen所示,当有人想要检索一个节点的所有子节点时,嵌套集层次模型是非常充分的,但是删除节点的效率非常低,因为必须重新组织整个树。因此,您应该通过考虑特定的树导航和更新方案来做出自己的决定。
希望我帮忙!
答案 1 :(得分:0)
尝试在向表中插入值时禁用AutoDetectChanges,以防止EntityFramework每次在场景后更改跟踪器。当我将数万条记录加载到数据库时,它帮助了我。请看下面的例子
model.Configuration.AutoDetectChangesEnabled = false;
// insert data
model.DataBaseContext.ChangeTracker.DetectChanges();
model.SubmitChanges();