2016-08-09 7 views
6

समस्या: सभी रिकॉर्ड whereJon Doe=<bus_contact>या<bus_sponsor> लौटाएं।एक्सएमएल पूछताछ करते समय LINQ में या शर्त कैसे जोड़ें?

वर्तमान कोड रिकॉर्ड 1 देता है, तो केवल एक प्रश्न का उपयोग कर रिकॉर्ड 1 और 2 को वापस करने के लिए क्या संशोधन की आवश्यकता है?

एक्सएमएल

<root> 
    <row> 
    <project_id>1</project_id> 
    <project_name>Name1</project_name> 
    <bus_contact>Jon Doe</bus_contact> 
    <bus_sponsor>Bruce Wayne</bus_sponsor> 
    </row> 
    <row> 
    <project_id>2</project_id> 
    <project_name>Name2</project_name> 
    <bus_contact>Peter Parker</bus_contact> 
    <bus_sponsor>Jon Doe</bus_sponsor> 
    </row> 
</root> 

सी #

class Program 
{ 
    static void Main (string[] args) 
    { 
     XElement main = XElement.Load ("master_list.xml"); 

     var results = main.Descendants ("row") 
      .Descendants ("bus_contact") 
      .Where (e => e.Value == "Jon Doe") 
      .Select (e => e.Parent)    
      .Select (e => new { 
       project_id = e.Descendants ("project_id").FirstOrDefault().Value, 
       project_name = e.Descendants ("project_name").FirstOrDefault().Value 
      }); 

     foreach (var result in results) 
      Console.WriteLine ("{0}, {1}", result.project_id, result.project_name); 
     Console.ReadLine(); 
    } 
} 

संपादित: यह वास्तव में एक ही समस्या के रूप में संभव डुप्लिकेट लिंक में बताया नहीं है। हां, यह आंशिक रूप से उस संदर्भ को संदर्भित करता है लेकिन एक शुरुआत के रूप में उपयुक्त संदर्भ के साथ एक उत्तर प्राप्त करने के रूप में, जो स्वीकार किया गया उत्तर प्रदान करता है, काफी उपयोगी है। संयोजन में

+0

[एकाधिक वंश प्रकार के संभावित डुप्लिकेट के बजाय Element विधि का उपयोग कर प्रत्येक प्रकार (bus_contact, bus_sponsor, आदि) आप पूरे क्वेरी को आसान बना सकता का केवल एक ही subelement आइटम है linq] (http://stackoverflow.com/questions/2059488/multiple-descendants-types-linq) –

उत्तर

4

उपयोग ||Any साथ, इस तरह:

var results = main.Descendants("row") 
    .Where(r => 
     r.Descendants("bus_contact").Any(c => c.Value == "Jon Doe") 
    || r.Descendants("bus_sponsor").Any(c => c.Value == "Jon Doe") 
    ); 

Any का उपयोग करके आप वास्तव में बच्चे स्तर पर उतरते बिना एक बच्चे पर एक शर्त के अनुसार क्वेरी करने देता है। Parent चुनकर पेड़ पर चढ़ने के लिए यह समाप्त हो गई आवश्यकता।

+0

बहुत बढ़िया। धन्यवाद!!! जैसे ही समय सीमा खत्म हो जाती है, उत्तर स्वीकार कर लिया जाएगा। – cyboashu

1

प्रत्येक row तत्व Descendants

var results = 
    main.Descendants ("row") 
    .Where (r => r.Element("bus_contact").Value == "Jon Doe" 
       || r.Element("bus_contact").Value == "Jon Doe") 
    .Select (r => new { 
     project_id = r.Element("project_id").Value, 
     project_name = r.Element("project_name").Value 
    }); 
+0

धन्यवाद। यह नहीं पता था। ++ – cyboashu

+1

@cyboashu उत्तर में नहीं जोड़ा गया है, लेकिन यदि 'पंक्ति' टैग 'रूट' का एकमात्र बच्चा है तो आप 'एलिमेंट्स' (बहुवचन) – Sehnsucht

+0

द्वारा 'descendants' को भी बदल सकते हैं। एक बार फिर धन्यवाद।! – cyboashu

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