2010-04-04 14 views
22
var cityList = from country in 
        doc.Element("result") 
        .Element("cities") 
        .Descendants("city") 
select new { 
     Name = country.Element("name").Value, 
     Code = country.Element("code").Value, 
     CountryCode = int.Parse(country 
         .Element("countrycode") 
         .Value) 
    }; 

foreach(var citee in cityList) 
{ 
    City city = new City(); 
    city.CountryID = from cnt in db.Countries 
        where cnt.DOTWInternalID == citee.CountryCode 
        select cnt.ID; 
} 

मुझे इस पोस्ट के शीर्षक में दिखाई देने वाली दूसरी क्वेरी पर एक त्रुटि मिल रही है। मैंने int से nullable int में कनवर्ट करने का प्रयास किया लेकिन कुछ भी काम नहीं किया। मेरी मदद करो, दोस्तों।अंतर्निहित रूप से प्रकार 'System.Linq.IQueryable <int>' से 'int' को परिवर्तित नहीं कर सकता है?

धन्यवाद

+0

क्या आपके उदाहरण के लिए और कुछ है? ऐसा लगता है कि लूप के हर पुनरावृत्ति के बाद सिटी ऑब्जेक्ट को हमेशा त्याग दिया जाएगा? – R0MANARMY

उत्तर

35

यह एक iQueryable वापस आ जाएगी, तो आप सबसे पहले

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID 
+0

ओह, मैं इस सवाल से पूछने के लिए इतना मूर्ख था, असल में मैंने यह ध्यान नहीं दिया था, असल में मैं इस बार इस सीएनटी पर ध्यान केंद्रित कर रहा था। डॉटब्लूएनआईआरआईआरआईडी == citee.CountryCode वापसी आईडी नहीं .. * श्वास * – Aneef

+2

गूंगा नहीं , मैं linq के साथ शुरू कर रहा हूँ और यह जवाब बस मुझे चाहिए था! धन्यवाद – pauloya

2

त्रुटि संदेश दर्शाता है के रूप में, अपने LINQ क्वेरी (सभी इरादों और मकसदों ints का एक संग्रह के लिए) रिटर्न एक System.Linq.IQueryable। यदि आप उनमें से एक प्राप्त करना चाहते हैं, तो आप n'th तत्व प्राप्त करने के लिए या तो First या ElementAt(n) पर कॉल कर सकते हैं।

5

IQueryable का उपयोग कर की तरह कुछ करने की आवश्यकता होगी एक भी पूर्णांक नहीं है - लेकिन एक प्रश्न है कि एक संग्रह का प्रतिनिधित्व कर सकते हैं।

6

यहाँ समस्या और db.Countries में समाधान

cnt से जहां cnt.DOTWInternalID == citee.CountryCode चयन cnt.ID हिस्सा है। यदि आप आईडी को छोड़ देते हैं तो यह देश के साथ जेनेरिक आईनेमरेबल लौटाता है (उम्मीद है कि आपके पास देश वर्ग है)। तो आपको सबसे पहले चुनिंदा मानदंड वापस करना है और आईडी फ़ील्ड के बाद पहली पंक्ति का चयन करना है। नीचे दिखाए गए जैसा ही है।

cit.CountryID = (from cnt in db.Countries where cnt.DOTWInternalID == citee.CountryCode select cnt).First<Country>().ID; 

इससे आपकी समस्या हल हो जाएगी।

8

यह पोस्ट के आखिरी अपडेट के बाद से काफी समय बीत चुका है लेकिन मुझे लगता है कि यह समाधान में सुधार लायक है।

मेरी राय में इस विशेष परिदृश्य के लिए पोस्ट किए गए समाधान आपको आवश्यक आईडी प्राप्त करने के लिए प्रदर्शन के मामले में सबसे अच्छा तरीका नहीं हैं। निम्नानुसार एक बेहतर समाधान है।

db.Countries.Where(a=>a.DOTWInternalID == citee.CountryCode) 
      .Select(a => a.ID).FirstOrDefault(); 

पिछले statemants मूल रूप से निम्नलिखित के समान एक SQL क्वेरी चलाता है:

SELECT TOP (1) ID 
FROM [dbo].[Countries] 
WHERE DOTWInternalID = 123 

प्रस्तावित समाधान काम करते हैं लेकिन मूल रूप से एक "SELECT *" कर सभी मूल्यों के साथ इकाई बनाने के लिए और उसके बाद प्राप्त आईडी ऑब्जेक्ट से अभी बनाया गया है।

आप लिंककैड का उपयोग वास्तव में जेनरेट किए गए SQL को देखने और LINQ क्वेरी या Lambdas को ट्यून करने के लिए कर सकते हैं।

आशा है कि यह कुछ अन्य लोगों को मदद मिलेगी जो इस पोस्ट में आते हैं।

0
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID 
संबंधित मुद्दे

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