繁体   English   中英

建立亲子关系的有效方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM