[英]Efficient way to create parent-child relation
为了获得父子关系,我使用了递归,
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操作。 有帮助吗?
我建议将树数据结构保存在关系数据库中 。 在此高级数据结构演示中,您可以找到一些可以有效用于在数据库中存储树的数据结构。 其中一些非常简单。
我必须警告您,这些结构并不总是易于实现的 。 性能上的提升可能会很大。
我使用了非常有效的嵌套集模型 。 当然,这取决于您的特定树导航方案 。 正如埃文·彼得森 ( Evan Petersen)所建议的,当有人想要检索一个节点的所有子节点时,嵌套集层次模型就足够了,但是由于必须重新组织整个树,因此删除节点的效率非常低。 因此,您应该通过考虑特定的树导航和更新方案来做出自己的决定。
希望我能帮上忙!
在将值插入表中时,请尝试禁用AutoDetectChanges,以防止EntityFramework更改跟踪器每次在场景后面触发。 当我将数万条记录加载到数据库时,这对我很有帮助。 看下面的例子
model.Configuration.AutoDetectChangesEnabled = false;
// insert data
model.DataBaseContext.ChangeTracker.DetectChanges();
model.SubmitChanges();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.