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