2009-04-06 25 views
40

मेरे पास प्रश्न कक्षा है जिसमें सार्वजनिक सूची संपत्ति है जिसमें कई उत्तर हो सकते हैं।linq प्रश्न: पूछताछ नेस्टेड संग्रह

मेरे पास एक प्रश्न भंडार है जो प्रश्नों और उसके उत्तरों को xml फ़ाइल से पढ़ने के लिए ज़िम्मेदार है।

तो मेरे पास प्रत्येक प्रश्न ऑब्जेक्ट के साथ प्रश्नों का संग्रह है जिसमें उत्तर का संग्रह है और मैं लिंक का उपयोग कर उत्तर के लिए इस संग्रह के प्रश्न (यानी इसके नाम से) पूछना चाहता हूं। मुझे नहीं पता कि यह ठीक से कैसे करें।

मैं इसे एक foreach के साथ कर सकता था, लेकिन मैं जानना चाहता हूं कि एक शुद्ध लिंक तरीका है क्योंकि मैं इसे सीख रहा हूं।

+0

आप एक से संबंधित एक जवाब के लिए देख रहे दिया गया प्रश्न या एक विशिष्ट उत्तर के लिए जो किसी भी प्रश्न से संबंधित हो सकता है? –

उत्तर

69

एक उत्तर खोजने के लिए।

questions.SelectMany(q => q.Answers).Where(a => a.Name == "SomeName") 

उत्तर के प्रश्न को खोजने के लिए।

questions.Where(q => q.Answers.Any(a => a.Name == "SomeName")) 

वास्तव में आप उत्तर या प्रश्न के संग्रह मिल जाएगा और आप First(), FirstOrDefault(), Single(), या SingleOrDefault() अपनी आवश्यकताओं के आधार पर एक विशिष्ट जवाब या सवाल पाने के लिए उपयोग करने के लिए होगा।

+2

मुझे उम्मीद है कि प्रश्नों को रखना होगा, इसलिए कुछ और: ... SelectMany (q => q.Answers.Select (a => new {ए = ए, क्यू = क्यू})। (Qa = > qa.A.Name == "SomeName") एक बेहतर फिट होगा। – Richard

+0

आप हमेशा उत्तर के साथ प्रश्न पर वापस आ सकते हैं। प्रश्न - अज्ञात प्रकार को पेश करने की कोई आवश्यकता नहीं है। –

+0

@danbruc: ऐसी कोई भी संपत्ति सूचीबद्ध नहीं है क्यू – Richard

32
from question in Questions 
from answer in question.Answers 
where answer.Name == something 
select question // or select answer 
+0

यही वह है जिसे मैं ढूंढ रहा था। –

7

उपयोग SelectMany और प्रथम/FirstOrDefault (यदि आप एक मूल्य की आवश्यकता होगी, कर रहे हैं)

List<Questions> questions = //initialization; 
var someAnswer = questions.SelectMany(q=>q.Answers) 
          .First(a=>a.Name =="MyName"); 
7

यह आप कुछ इस तरह इस्तेमाल कर सकते हैं लगता है:

var query = from q in questions 
      from a in q.Answers 
      where a.Name == "Answer Name" 
      select a; 
संबंधित मुद्दे