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; 
} 

Je reçois une erreur sur la deuxième requête comme vu dans le titre de cet article. J'ai essayé de convertir en int en nullable int mais rien n'a fonctionné. Aidez-moi, les gars.Impossible de convertir implicitement le type 'System.Linq.IQueryable <int>' en 'int?'

Merci

+0

Y at-il plus à votre exemple? Il semble que l'objet City sera toujours défaussé après chaque itération de la boucle? – R0MANARMY

Répondre

35

il retournera un IQueryable, vous devez faire quelque chose comme l'utilisation de la première

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

oups j'étais tellement bête de poser cette question, en fait je n'ai pas remarqué cela, en fait je me suis concentré sur ce cnt.DOTWInternalID == citee.CountryCode pas l'ID de retour .. * sigh * – Aneef

+2

Pas stupide , Je commence avec Linq et cette réponse était juste ce dont j'avais besoin! Merci – pauloya

2

Comme le message d'erreur indique, votre requête Linq retourne un System.Linq.IQueryable (pour toutes fins utiles une collection de ints). Si vous souhaitez en obtenir un, vous pouvez appeler le First ou le ElementAt(n) pour obtenir le nième élément.

5

IQueryable est pas un seul int - mais une requête qui peut représenter une collection.

6

Voici le problème et la solution

de cnt dans db.Countries où cnt.DOTWInternalID == citee.CountryCode sélectionner une partie cnt.ID. Si vous omettez l'ID, il renvoie un IEnumerable générique avec Country (en espérant que vous avez la classe Country). Donc, ce que vous avez à faire est d'abord retourner les critères de sélection et sélectionnez la première ligne, puis le champ ID. Même comme indiqué ci-dessous.

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

Cela résoudra votre problème.

8

Il s'est écoulé beaucoup de temps depuis la dernière mise à jour de la publication, mais je pense que cela vaut la peine d'améliorer la solution. À mon avis, les solutions publiées pour ce scénario particulier ne sont pas la meilleure façon d'obtenir l'ID dont vous avez besoin. Une meilleure solution est la suivante.

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

Les statemants précédents fonctionne essentiellement une requête SQL similaire à la suivante:

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

Les solutions proposées fonctionnent mais, fondamentalement, faire un "SELECT *" pour créer l'entité avec toutes les valeurs et obtenir l'ID de l'objet qui vient d'être créé.

Vous pouvez utiliser Linqpad pour voir réellement les requêtes SQL et pour optimiser les requêtes LINQ ou Lambdas générées.

J'espère que cela aide à d'autres personnes qui arrivent à ce poste.

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