ienumerable - How can I iterate over a collection of objects returned by a LINQ-to-XML query? -


मुझे यह XML मिला है:

  & lt; बिलिंगलिंग & gt; & LT; BillingItem & gt; & LT; तिथि और समय & gt; 2003/11/04 & lt; / तारीख और समय & gt; & Lt; एप्लिकेशन-नाम & gt; बिलिंग सेवा & lt; / application-name & gt; & LT; गंभीरता & gt; चेतावनी & lt; / गंभीरता & gt; & LT; प्रक्रिया आईडी & gt; 123 & lt; / प्रक्रिया आईडी & gt; & Lt; विवरण & gt; कनेक्शन पर समय समाप्त & lt; / description & gt; & Lt; विस्तार & gt; तीन पुनर्प्रयास के बाद समय समाप्त हो गया। & Lt; / detail & gt; & Lt; / BillingItem & gt; & LT; BillingItem & gt; & LT; तिथि और समय & gt; 2010-05-15 & lt; / तारीख और समय & gt; & Lt; एप्लिकेशन-नाम & gt; कॉलबैक सेवा & lt; / application-name & gt; & LT; गंभीरता & gt; त्रुटि & lt; / गंभीरता & gt; & LT; प्रक्रिया आईडी & gt; 456 & lt; / प्रक्रिया आईडी & gt; & Lt; विवरण & gt; कॉलबैक पर कार्रवाई करने में असमर्थ & lt; / description & gt; & Lt; विस्तार & gt; दो रिट्रीज़ के बाद समेटे का समय समाप्त। & Lt; / detail & gt; & Lt; / BillingItem & gt; & Lt; / BillingLog & gt;  

कि मैं LINQ-to-XML को एक बिलिंग बिलिंग वस्तु में निहित बिलिंग ऑब्जेक्ट के संग्रह में प्रोजेक्ट करना चाहता हूं।

  सार्वजनिक वर्ग बिलिंगलिंग {सार्वजनिक IEnumerable & LT; BillingItem & gt; आइटम {प्राप्त; सेट; }} सार्वजनिक वर्ग बिलिंगिंग {सार्वजनिक स्ट्रिंग दिनांक {get; सेट; } सार्वजनिक स्ट्रिंग ApplicationName {get; सेट; } सार्वजनिक स्ट्रिंग गंभीरता {प्राप्त; सेट; } सार्वजनिक प्रसंस्करण प्रक्रिया {प्राप्त करें; सेट; } सार्वजनिक स्ट्रिंग विवरण {get; सेट; } सार्वजनिक स्ट्रिंग विवरण {get; सेट करें;}}  

यह LINQ क्वेरी है जिसका उपयोग मैं XML प्रोजेक्ट करने के लिए कर रहा हूं (जो स्ट्रिंग वेरिएबल source में है)।

<पूर्व> XDocument xdoc = XDocument.Parse (स्रोत); Var log = से i xdoc.Elements ("बिलिंगलिंग") में नए बिलिंगिंग चुनें {आइटम = i.Descendants में ("बिलिंगआईटीम") नए बिलिंगिंग का चयन करें {दिनांक = (स्ट्रिंग) j.Element ("तारीख और समय "), ApplicationName = (स्ट्रिंग) j.Element (" application-name "), सेवरिटी = (स्ट्रिंग) j.Element (" severity "), ProcessId = (int) j.Element (" process-id "), विवरण = (स्ट्रिंग) j.Element ("description"), विस्तार = (स्ट्रिंग) j.Element ("detail")}};

जब मैं foreach का उपयोग करके लॉग में वस्तुओं की कोशिश करता हूं और पुनरावृत्त करता हूं।

मुझे LINQPad से निम्न त्रुटि संदेश मिलता है।

  प्रकार 'UserQuery.BillingLog' को 'UserQuery.BillingItem' में परिवर्तित नहीं किया जा सकता है  < / Pre> 

पहले से धन्यवाद।

ऐसा इसलिए है क्योंकि आपका लॉग वेरिएबल में बिलिंगलिंग ऑब्जेक्ट का संग्रह होता है, न कि BillingItem । आपको कुछ ऐसा करना है:

  foreach (लॉग इन में बिलिंग लॉग) {foreach (एलआईटम्स में बिलिंग आइटम) {Console.WriteLine (...); }}  

वैकल्पिक रूप से, यदि आपका मूल इरादा केवल सभी बिलिंगआईटम s का चयन करना था, तो उनके माता पिता बिलिंगलिंग s को पूरी तरह से रद्द करना, आपकी क्वेरी इस तरह से दोबारा लिखे: एलडी डिसेंडेंट्स ("बिलिंग इटैम") में जम्मू से एक्सडॉक एलेमेंट्स ("बिलिंगलिंग") में एल लॉग इन से एल लॉग इन करें। नई बिलिंगिंग {दिनांक = (स्ट्रिंग) का चयन करें। J.Element ("तारीख और समय"), ApplicationName = (स्ट्रिंग) j.Element ("application-name"), Severity = (string) j.Element ("severity"), ProcessId = (int) j एलिमेंट ("प्रोसेस-आईडी"), विवरण = (स्ट्रिंग) j.Element ("description"), विस्तार = (स्ट्रिंग) j.Element ("detail")}

यह आपको सभी बिलिंगकरण s का सभी बिलिंगलिंग s से चयनित का सादा संग्रह दें, जबकि बिलिंगलिंग s स्वयं पूरी तरह से खारिज कर दिया जाएगा।


Comments