Impossible de convertir implicitement le type ‘System.Linq.IQueryable ‘ en ‘int?’

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.Counsortinges 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 ce message. J’ai essayé de convertir 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.Counsortinges.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 d’obtenir l’ID dont vous avez besoin. Une meilleure solution est la suivante.

 db.Counsortinges.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].[Counsortinges] WHERE DOTWInternalID = 123 

Les solutions proposées fonctionnent mais font en gros un "SELECT *" pour créer l’entité avec toutes les valeurs, puis obtenir l’ID de l’object qui vient d’être créé.

Vous pouvez utiliser Linqpad pour voir 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.Counsortinges où cnt.DOTWInternalID == citee.CountryCode sélectionne la partie cnt.ID. Si vous omettez l’ID, il retourne 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.Counsortinges where cnt.DOTWInternalID == citee.CountryCode select cnt).First().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 retourne un System.Linq.IQueryable (à toutes fins utiles, 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.Counsortinges.First(a=>a.DOTWInternalID == citee.CountryCode).ID