2012-10-19 11 views
8

में एक अभिभावक को बाल प्रकार का प्रदर्शन करना माता-पिता द्वारा सूची को क्रमबद्ध करना है, और फिर बच्चा (केवल एक बच्चा होगा)।लिंक्स

Example Set: 
ID ParentId Type Unit 
1 NULL Energy kJ 
2 1  Cal 
3 NULL Protein g 
4 NULL Fat, total g 
5 4  Saturated g 
6 NULL Carbohydrate g 
7 6  Sugars g 
8 NULL Dietary fibre g 
10 NULL Sodium mg 
11 NULL Potassium mg 

इसलिए उदाहरण के लिए, अगर मैं प्रकार प्रकार (वर्णमाला क्रम) द्वारा इसे

  • शुगर्स (माता-पिता = 1.)
  • आहार फाइबर
  • ऊर्जा आएगा

    1. कार्बोहाइड्रेट
    2. कैल (पैरेंट = 4.)
    3. वसा, कुल
    4. संतृप्त (मूल = 6.)
  • +1

    जब आप माता-पिता द्वारा कहते हैं और बच्चे द्वारा, क्या आपका मतलब आईडी है? या आप का मतलब है कि आप पी 1, सी 1, पी 2, सी 2, पी 3, सी 3, आदि देखना चाहते हैं ...? यह एक अच्छा सवाल है, यह बिल्कुल अस्पष्ट है कि आप वास्तव में क्या परिणाम देखना चाहते हैं। शायद एक नमूना जो परिणाम आप उम्मीद करेंगे दिखा रहे हैं? –

    +0

    @JamesMichaelHare – ediblecode

    +0

    में अपेक्षित सेट जोड़ा गया है मैं आपके डेटा से मानता हूं कि आपको गारंटी है कि एक बच्चा आईडी अपने मूल आईडी से कभी अधिक नहीं है? –

    उत्तर

    4

    इस प्रयास करें:

    return myData.Select(x => new { key = (x.Parent ?? x).Type, item = x}) 
          .OrderBy(x => x.key) 
          .ThenBy(x => x.item.Parent != null) 
          .Select(x => x.item); 
    
    +0

    यह काम करता है। बस भविष्य के उपयोगकर्ताओं के लिए: यह होना चाहिए। फिर। (X => x.item.Parent == null) ' – ediblecode

    +0

    ओह। संपादित। इसे पकड़ने के लिए धन्यवाद। – Bobson

    +1

    आह हाँ, यह वास्तव में काम नहीं करता है, ऐसा लगता है क्योंकि मेरा डेटा पहले से ही सही क्रम में था। – ediblecode

    1

    यह दो चरणों में किया जा सकता है। प्रथम - निर्माण अभिभावक-बच्चे पदानुक्रम (और यह छँटाई): -

    var query = from parent in data 
          where parent.ParentId == null 
          orderby parent.Type 
          join child in data on parent.ID equals child.ParentId into g 
          select new { Parent = parent, Children = g }; 
    

    दूसरा चापलूसी पदानुक्रम

    var result = query.Flatten(x => x.Parent, x => x.Children); 
    

    मैं चापलूसी के लिए विस्तार विधि का इस्तेमाल किया:

    public static IEnumerable<TResult> Flatten<T, TResult>(
        this IEnumerable<T> sequence, 
        Func<T, TResult> parentSelector, 
        Func<T, IEnumerable<TResult>> childrenSelector) 
    { 
        foreach (var element in sequence) 
        { 
         yield return parentSelector(element); 
    
         foreach (var child in childrenSelector(element)) 
          yield return child; 
        } 
    }  
    
    0

    यह

    काम करना चाहिए
    var query = from p in context.Table 
          from c in context.Table.Where(x => p.ID == x.ParentId) 
                .DefaultIfEmpty() 
          let hasNoParent = c == null 
          orderby hasNoParent ? p.Type : c.Type, hasNoParent ? 0 : 1 
          select hasNoParent ? p.Type : c.Type; 
    
    +0

    स्पष्ट रूप से वर्तमान संदर्भ में 'c' मौजूद नहीं है – ediblecode

    +0

    @ डनरहुल - क्षमा करें, यह x होना चाहिए था।ParentId – Aducci

    +0

    काम नहीं किया मैं डर रहा हूं, 6 नल, यादृच्छिक दोहराने वाले डेटा के बाद – ediblecode

    संबंधित मुद्दे