2010-01-28 8 views
6
var subset = from item in document.Descendants("Id") 
      where item.Value == itemId.ToString() 
      select new PurchaseItem() { 
       Id = int.Parse(item.Parent.Element("Id").Value), 
       Name = item.Parent.Element("Name").Value, 
       Description = item.Parent.Element("Description").Value, 
       Price = int.Parse(item.Parent.Element("Price").Value) 
      }; 

एक्सएमएल की संरचना निम्नानुसार है:क्या लिंक-एक्सएमएल हमेशा इतना गन्दा है?

<Items> 
    <Item> 
     <Id></Id> 
     <Name></Name> 
     <Description></Description> 
     <Price></Price> 
    </Item> 
</Items> 

आईडी, और कीमत दोनों पूर्णांक मान हैं। नाम और विवरण तार हैं।

मुझे Linq to XML महान मिला है जिसके लिए मैंने इसका उपयोग किया है, यह सिर्फ एक स्निपेट है। लेकिन, दूसरी ओर मुझे लगता है कि यह महसूस करना चाहिए या क्लीनर हो सकता है। कास्टिंग इस स्निपेट में सबसे स्पष्ट मुद्दा प्रतीत होता है।

कोई सलाह?

+1

इस XmlReader का उपयोग कर कर प्रयास करें, या पुराने भी एक्सएमएल डोम, और आप 'गन्दा' के अपने दृश्य का पुनर्मूल्यांकन करेंगे। ;) – Noldorin

+0

यहां वाक्यविन्यास गतिशील के साथ इतना साफ होगा। कल्पना करें 'आईडी = item.Id', आदि –

+0

@ नोल्डोरिन -' untidy 'तब अधिक उपयुक्त होगा;) अतीत में XMLReader के साथ मेरा काम, अब वह गन्दा था। – Finglas

उत्तर

13

असल में यह int.Parse पर कॉल करने के बजाय बेहतर आईएमओ होगा।

var subset = from item in document.Descendants("Item") 
      where item.Element("Id").Value == itemId.ToString() 
      select new PurchaseItem() 
         { 
          Id = int.Parse(item.Element("Id").Value), 
          Name = item.Element("Name").Value, 
          Description = item.Element("Description").Value, 
          Price = int.Parse(item.Element("Price").Value) 
         }; 
+2

आदमी, आप तेज़ हैं .... –

+0

जॉन, जिस तरह से मैं इसे दिखाता हूं, उससे कोई टिप्पणी नहीं, इस तरह से इसे क्यों करें? –

+0

@ जोन - कैसे आते हैं। वैल्यू की आवश्यकता नहीं है? क्या इसे दृश्यों के पीछे स्पष्ट रूप से बुलाया जाता है? – Finglas

1

मुझे लगता है कि आपके पास "आइटम" नोड भी है?

आप कुछ इस तरह कर सकता है, यह सोचते हैं कि आप() XElement.Load का उपयोग कर दस्तावेज़ लोड कर रहे हैं

var subset = from item in document.Elements("Item") 
      where item.Element("Id").Value == itemId.ToString() 
      select new PurchaseItem() { 
       Id = int.Parse(item.Element("Id").Value), 
       Name = item.Element("Name").Value, 
       Description = item.Element("Description").Value, 
       Price = int.Parse(item.Element("Price").Value) 
      }; 

नहीं एक बहुत बेहतर है, लेकिन बहुत आसान को पढ़ने के लिए!

1

अपने उदाहरण में आप एक छोटा सा <Item/> तत्व <Id/> खोजने के बजाय Parent हर बार हो रही से बचने के लिए द्वारा साफ कर सकते हैं: यहाँ कैसे मैं आपकी क्वेरी लिखते थे है कि XML तत्व लेता PurchaseItem के लिए एक नया निर्माता लेखन है, तो आप लिख सकते हैं:

select new PurchaseItem(item.Parent); 
+0

मैं orginially यह था, लेकिन कोड के साथ खेलने के बाद इसे बदल दिया। तो मुझे दिखाने के लिए +1 यह किया जा सकता है। – Finglas

1

पर विचार करें:

string id = itemId.ToString(); // We don't need to convert it each time! 

var subset = from item in document.Descendants("Id") 
      where item.Value == id 
      let parent = item.Parent 
      select new PurchaseItem 
      { 
       Id = (int) parent.Element("Id"), 
       Name = (string) parent.Element("Name"), 
       Description = (string) parent.Element("Description"), 
       Price = (int) parent.Element("Price") 
      }; 
संबंधित मुद्दे