2010-04-04 8 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; 
} 

Ich bekomme einen Fehler bei der zweiten Abfrage, wie im Titel dieses Beitrags zu sehen. Ich habe versucht, zu int zu nullable int zu konvertieren, aber nichts hat funktioniert. Hilf mir, Jungs.Kann den Typ 'System.Linq.IQueryable <int>' nicht implizit in 'int?' Konvertieren

Dank

+0

Gibt es mehr zu Ihrem Beispiel? Es sieht so aus, als ob das City-Objekt nach jeder Iteration der Schleife immer verworfen wird. – R0MANARMY

Antwort

35

es wird eine IQueryable zurückgeben, müssen Sie so etwas wie mit dem Ersten

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

oops Ich war so dumm, diese Frage zu stellen, eigentlich habe ich das nicht bemerkt, eigentlich war ich die ganze Zeit konzentriert auf diese cnt.DOTWInternalID == citee.CountryCode nicht die zurückgehende ID .. * seufz * – Aneef

+2

Nicht dumm , Ich beginne mit linq und diese Antwort war genau das, was ich brauchte! Vielen Dank – pauloya

2

Da die Fehlermeldung sagt, Ihre Linq Abfrage eine System.Linq.IQueryable zurückgibt (für alle Absichten und Zwecke eine Sammlung von Ints). Wenn Sie eine davon erhalten möchten, können Sie entweder First oder ElementAt(n) anrufen, um das n-te Element zu erhalten.

5

IQueryable ist kein einziges int tun - aber eine Abfrage, die eine Sammlung darstellen kann.

6

Hier ist das Problem und Lösung

von cnt in db.Countries wo cnt.DOTWInternalID == citee.CountryCode cnt.ID Teil auswählen. Wenn Sie die ID weglassen, wird ein Generic IEnumerable mit Country zurückgegeben (in der Hoffnung, dass Sie eine Country-Klasse haben). Sie müssen also zuerst die Auswahlkriterien zurückgeben und die erste Zeile und dann das ID-Feld auswählen. Das gleiche wie unten gezeigt.

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

Dies wird Ihr Problem lösen.

8

Es ist eine lange Zeit seit der letzten Aktualisierung der Post vergangen, aber ich denke, es lohnt sich, die Lösung zu verbessern.

Meiner Meinung nach sind die Lösungen für dieses spezielle Szenario nicht der beste Weg, um die benötigte ID zu erhalten. Eine bessere Lösung ist wie folgt.

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

Die vorherigen statemants läuft im Grunde eine SQL-Abfrage ähnlich der folgenden ein:

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

Die vorgeschlagenen Lösungen arbeiten, aber tun im Grunde eine "SELECT *" die Einheit mit allen Werten zu erstellen und erhalten dann die ID von dem gerade erstellten Objekt.

Sie können Linqpad verwenden, um tatsächlich das generierte SQL anzuzeigen und LINQ-Abfragen oder Lambdas zu optimieren.

Hoffe es hilft zu einigen anderen, die zu diesem Pfosten kommen.

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