2016-11-21 1 views
5

मैं एक छोटे से मेनू है जो मैं निम्नलिखित की तरह डीबी तालिका आईडी से ऑर्डर करने के लिए करना चाहते हैं:आदेश मेनू नोड्स

public class Obj 
    { 
     public string Value { get; set; } 
     public int? ParentNodeId { get; set; } 
     public int? PreviousNodeId { get; set; } 
     public int? NextNodeId { get; set; } 
    } 

private IEnumerable<MenuNodeDTO> GetSortedMenuNodes(int menuId) 
    { 
     var nodes = LoadMenuNodes(menuId); 
     foreach (MenuNode menuNode in nodes 
      .Where(s => s.MenuItemId == null && s.ParentNodeId == null) 
      .OrderBy(x => x?.PreviousNodeId) 
      .Where(x => x.PreviousNodeId != x.Id)) 
     { 
      MenuNodeDTO tmpMenuNode = new MenuNodeDTO(); 
      tmpMenuNode.MenuNodeDtoId = menuNode.Id; 
      tmpMenuNode.MenuItemCode = menuNode.MenuItem?.Code; 
      tmpMenuNode.ChildMenuNodes = GetChildNodes(menuNode).ToList(); 
      tmpMenuNode.MenuSettings = GetMenuSettings(menuNode).ToList(); 
      yield return tmpMenuNode; 
     } 
} 

उदाहरण:

Id = 1 MainMenuPoint1 ParentNodeId = null, PreviousNodeId = null, NextNodeId = 4 
Id = 2 -> 1 ChildNodeFromPoint1 ParentNodeId = 1, PreviousNodeId = null, NextNodeId = null 
Id = 3 --> ChildNodeFromFirstChildNode1 ParentNodeId = 2, PreviousNodeId = null, NextNodeId = null 
Id = 4 MainMenuPoint2 ParentNodeId = null, PreviousNodeId = 1, NextNodeId = null 

प्रत्येक के लिए मेरे साथ समस्या यह है कि जब आईडी बदलती है तो आदेश काम नहीं करता है। क्या किसी को यह पता है कि अभिभावक, पिछली और अगली आईडी द्वारा आदेश कैसे दिया जाए जो हर समय रिश्ते के लिए सभी आईडी जांचता है?

+1

मेरे लिए, मैं एक और डीबी संरचना का सुझाव दूंगा: 'पेरेंट नोड आईडी' और 'ऑर्डर'। आप अपने नोड्स को ऑर्डर करने के लिए डीएफएस का उपयोग करने और पत्तियों को ऑर्डर करने के लिए 'ऑर्डर' का उपयोग करने में सक्षम होंगे। ऑर्डर को भी अलग होने की गारंटी नहीं दी जानी चाहिए, नोड 1 के सभी बच्चों के आइटम में ऑर्डर = 0 हो सकता है - इसका मतलब है कि उन्हें नाम \ आईडी \ और कुछ भी हल किया जाना चाहिए, इससे कोई फर्क नहीं पड़ता। –

+1

@YeldarKurmangaliyev समस्या तब है जब आप मेनू संरचना को बदल देंगे, नोड को स्थानांतरित करेंगे या नोड हटा देंगे? –

+1

आदेश के बारे में बात करना, नोड को हटाने या स्थानांतरित करना कुछ भी नहीं बदलता - यह बहुत अच्छा काम करता है। अभिभावक संबंधों के बारे में बात करते हुए, यदि आपके बच्चे नोड्स हैं तो आप नोड को हटा नहीं सकते हैं। डेटा अखंडता का सवाल यही है। इसे हटाने से पहले आपको अपने बच्चे नोड्स सूची को साफ़ करने की आवश्यकता है। –

उत्तर

1
private IEnumerable<MenuNodeDTO> GetSortedNodes(Menu menu, MenuNode node) 
     { 
      List<MenuNodeDTO> items = new List<MenuNodeDTO>(); 

      var nodes = node != null ? node.ChildMenuNodes : menu.MenuNodes; 
      var nextNode = node == null 
       ? nodes.Where(c => c.PreviousNodeId == null && c.ParentNodeId == null).FirstOrDefault() 
       : nodes.Where(c => c.ParentNodeId == node.Id && c.PreviousNodeId == null).FirstOrDefault(); 

      while (nextNode != null) 
      { 
       MenuNodeDTO tmpMenuNode = new MenuNodeDTO(); 
       tmpMenuNode.MenuNodeDtoId = nextNode.Id; 
       tmpMenuNode.MenuItemCode = nextNode?.MenuItem?.Code; 
       tmpMenuNode.ChildMenuNodes = this.GetSortedNodes(menu, nextNode).ToList(); 
       tmpMenuNode.MenuSettings = GetMenuSettings(nextNode).ToList(); 
       items.Add(tmpMenuNode); 
       if (!nextNode.NextNodeId.HasValue) break; 
       nextNode = nextNode.NextNode; 
      } 
      return items; 
     } 
संबंधित मुद्दे