web-dev-qa-db-ja.com

型 'System.Linq.IQueryable <int>'を暗黙的に '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;
}

この投稿のタイトルに見られるように、2番目のクエリでエラーが発生しています。 intnullable intに変換しようとしましたが、何も機能しませんでした。助けてくれ、みんな。

ありがとう

30
Aneef

iQueryableを返します。最初の

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

投稿の最後の更新から長い時間が経過していますが、ソリューションを改善する価値があると思います。

私の意見では、この特定のシナリオ用に投稿されたソリューションは、必要なIDを取得するためのパフォーマンスの面で最良の方法ではありません。より良い解決策は次のとおりです。

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

以前のステートマントは、基本的に次のようなSQLクエリを実行します。

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

提案されたソリューションは機能しますが、基本的には"SELECT *"すべての値を持つエンティティを作成し、作成したばかりのオブジェクトからIDを取得します。

Linqpadを使用して、生成されたSQLを実際に表示し、LINQクエリまたはLambdasを調整できます。

この投稿にたどり着く他の人たちの助けになることを願っています。

12
Charles

ここに問題と解決策があります

cnt.DOTWInternalID == citee.CountryCode select cnt.IDのdb.Countriesのcntから part。 IDを省略すると、Countryを持つGeneric IEnumerableが返されます(Countryクラスがあることを望みます)。したがって、最初に選択基準を返し、最初の行を選択してからIDフィールドを選択する必要があります。以下のように同じ。

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

これで問題が解決します。

6
wonde

IQueryableは単一のintではなく、コレクションを表すことができるクエリです。

5
Maggie

エラーメッセージに示されているように、LinqクエリはSystem.Linq.IQueryableを返します(すべての意図と目的のためにintのコレクション)。それらのいずれかを取得する場合は、 First または ElementAt(n) を呼び出して、n番目の要素を取得できます。

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