2014-01-21 2 views
0

Чтобы получить родитель-ребенок отношение я использую рекурсии,эффективный способ создания родитель-потомок отношения

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 записей, но если у меня есть записи более чем 5к или 10k, то я закончил с худшим случаем 4-5 минут обработки. Я ищу другой путь или любую оптимизацию. В настоящее время я сохраняю свой день, используя cahce, но мне нужно, чтобы это выполнялось, поскольку могут выполняться различные операции CRUD. Любая помощь ?

ответ

1

Я бы предложил сохранить структуру данных дерева внутри реляционной базы данных. В этом presentation of advanced data structures вы можете найти некоторые структуры данных, которые могли бы эффективно использоваться для хранения дерева в базе данных. Некоторые из них довольно просты.

Я должен предупредить вас, что эти конструкции не всегда легко реализовать. Однако выигрыш в производительности может быть большим.

Я использовал nested set model, который я нашел очень эффективным. Это, конечно, зависит от ваших конкретных сценариев навигации по дереву. Как предполагает Evan Petersen, иерархическая модель вложенных множеств достаточно высока, когда кто-то хочет получить все дочерние узлы одного узла, но очень неэффективен для удаления узла, потому что все дерево должно быть реорганизовано. Поэтому вы должны принять свое собственное решение, приняв во внимание вашу специфику навигации по дереву и обновления.

Надеюсь, я помог!

+0

спасибо, что приводит меня к моему решению, я хранить весь объект дерева графа в базе данных сериализации в XML, и вице-стих, таким образом я не нужен, чтобы создать структуру снова и опять. Это дает мне большую гибкость и занимает меньше времени. –

0

Попытайтесь отключить AutoDetectChanges, в то время как вы вставляете значения в таблицу, чтобы предотвратить смену Tracker EntityFramework каждый раз позади на сцене. Это помогло мне, когда я загрузил десятки тысяч записей в базу данных. Посмотрите на пример ниже

model.Configuration.AutoDetectChangesEnabled = false; 
// insert data 
model.DataBaseContext.ChangeTracker.DetectChanges(); 
model.SubmitChanges(); 
Смежные вопросы