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 indiqué 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.
Merci
il retournera un iQueryable, vous devrez faire quelque chose comme utiliser le premier
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
Cela fait longtemps que la dernière mise à jour a été postée, mais je pense que cela vaut la peine d’améliorer la solution.
À mon avis, les solutions affichées pour ce scénario particulier ne sont pas le meilleur moyen en termes de performances 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 exécutent essentiellement une requête SQL similaire à la suivante:
SELECT TOP (1) ID
FROM [dbo].[Countries]
WHERE DOTWInternalID = 123
Les solutions proposées fonctionnent, mais font essentiellement un "SELECT *"
pour créer l'entité avec toutes les valeurs, puis obtenir l'ID de l'objet qui vient d'être créé.
Vous pouvez utiliser Linqpad pour voir réellement le SQL généré et régler les requêtes LINQ ou Lambdas.
J'espère que cela aidera certains autres qui arriveront à ce post.
Voici le problème et la solution
depuis cnt dans db.Countries où cnt.DOTWInternalID == citee.CountryCode sélectionnez cnt.ID part. Si vous omettez l'ID, il renvoie un IEnumerable générique avec Country (en espérant que vous ayez la classe Country). Vous devez donc d'abord renvoyer les critères de sélection, puis sélectionner la première ligne, puis le champ ID. Comme 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.
IQueryable n'est pas un simple int - mais une requête pouvant représenter une collection.
Comme le message d'erreur le dit, votre requête Linq renvoie un System.Linq.IQueryable (à toutes fins pratiques, une collection d'ints). Si vous souhaitez en obtenir un, vous pouvez appeler First ou ElementAt (n) pour obtenir le nième élément.
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID