web-dev-qa-db-fra.com

Impossible de convertir implicitement le type 'System.Linq.IQueryable <int>' 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.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

25
Aneef

il retournera un iQueryable, vous devrez faire quelque chose comme utiliser le premier

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

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.

8
Charles

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.

6
wonde

IQueryable n'est pas un simple int - mais une requête pouvant représenter une collection. 

5
Maggie

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.

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