2009-03-12 12 views
16

मैं SelectMany के साथ एक संग्रह के भीतर एक बच्चे संग्रह के परिणामों समतल कर सकते हैं:SelectMany तीन स्तर दीप

// a list of Foos, a Foo contains a List of Bars 
var source = new List<Foo>() { ... }; 

var q = source.SelectMany(foo => foo.Bar) 
    .Select(bar => bar.barId) 
.ToList(); 

यह मेरे फू सूची में सभी बार आईडी की सूची देता है। जब मैं तीन स्तरों को गहराई से जाने का प्रयास करता हूं तो गलत परिणाम वापस आ जाता है।

var q = source.SelectMany(foo => foo.Bar) 
    .SelectMany(bar => bar.Widget) 
     .Select(widget => widget.WidgetId) 
.ToList(); 

मुझे फूओस की सूची में सभी बार्स में सभी विजेटों की सूची प्राप्त करने के लिए SelectMany का उपयोग कैसे करना चाहिए?

संपादित करें मैंने उपर्युक्त वाक्य को याद किया, लेकिन कोड लक्ष्य को दर्शाता है। मैं विजेट्स नहीं, सभी विजेट आईडी की एक सूची की तलाश में हूँ।

एक "गलत" परिणाम सभी विजेट आईडी वापस नहीं आये हैं।

+0

मेरे लिए ठीक लग रहा है निर्दिष्ट कर सकते हैं इस() के साथ SelectMany का अधिभार कॉल कर सकते हैं। "गलत परिणाम लौटाया गया है" एक वर्णनात्मक त्रुटि संदेश नहीं है, आप क्या प्राप्त करते हैं, और आप क्या उम्मीद करते हैं? – erikkallen

उत्तर

30

आपकी क्वेरी सभी विजेटों के बजाय सभी विजेट आईडी लौट रही है। तुम सिर्फ विगेट्स चाहते हैं, बस का उपयोग करें:

var q = source.SelectMany(foo => foo.Bar) 
       .SelectMany(bar => bar.Widget) 
       .ToList(); 

हैं कि अभी भी "गलत परिणाम" दे रही है क्या रास्ता यह गलत परिणाम है में समझाएं। नमूना कोड बहुत मददगार :) होगा

संपादित करें: ठीक है, यदि आप विजेट आईडी चाहते हैं, अपने मूल कोड ठीक किया जाना चाहिए:

var q = source.SelectMany(foo => foo.Bar) 
       .SelectMany(bar => bar.Widget) 
       .Select(widget => widget.WidgetId) 
       .ToList(); 

भी

var q = (from foo in source 
     from bar in foo.Bar 
     from widget in bar.Widget 
     select widgetId).ToList(); 

के रूप में लिखा जा सकता है कि अगर आपको क्वेरी अभिव्यक्ति प्रारूप पसंद है।

यह वास्तव में काम करना चाहिए - अगर यह काम नहीं कर रहा है, तो यह बताता है कि आपके डेटा में कुछ गड़बड़ है।

हमें पहले जांच करनी चाहिए - क्या यह केवल LINQ ऑब्जेक्ट्स, या एक फैनसीयर प्रदाता (उदा। LINQ से SQL) है?

+1

हाँ, मुझे सभी विजेट आईडी कहना था, विजेट वापस नहीं आए। जब मैं चेन SelectMany (...)। SelectMany (...)। चुनें() अंतिम चयन किसी कारण से सभी विजेट आईडी की सूची वापस नहीं करता है। – blu

+0

इसकी LINQ-to-Objects। ठीक है जब तक कि यह काम करने के तरीके के बारे में सटीक है, मैं इस मुद्दे को डेटा तक सीमित कर सकता हूं और वहां से जा सकता हूं, धन्यवाद। – blu

2
var q = (
    from f in foo 
    from b in f.Bars 
    from w in b.Widgets 
    select w.WidgetId 
    ).ToList(); 

यह भी ध्यान दें कि यदि आप अनूठी सूची चाहते हैं, तो आप कर सकते हैं। डिस्टिंक()। ToList() इसके बजाए।

+0

यह एक बार प्रति फू मान रहा है, और प्रति बार एक विजेट। –

+0

@ जोन लेकिन क्या वह ठीक से नहीं कर रहा है? – eglasius

+0

नहीं। वह प्रति बाउ एकाधिक बार चुन रहा है - यही वह है जो SelectMany करता है। –

1
 var q = source.SelectMany(foo => foo.Bar) 
      .SelectMany(bar => bar.Widget,(bar,widget) => widget.WidgetId) 
      .ToList(); 

हम हमारे प्रक्षेपण लैम्ब्डा experession का उपयोग कर

+0

यहां हम चार की बजाय तीन विधियों को कॉल करना समाप्त कर देते हैं –

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