创建父子关系的有效方式

时间:2014-01-21 05:56:42

标签: c# sql-server asp.net-mvc

要获得父子关系,我使用递归,

 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操作。任何帮助?

2 个答案:

答案 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();