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番目のクエリでエラーが発生しています。 int
をnullable int
に変換しようとしましたが、何も機能しませんでした。助けてくれ、みんな。
ありがとう
iQueryableを返します。最初の
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
投稿の最後の更新から長い時間が経過していますが、ソリューションを改善する価値があると思います。
私の意見では、この特定のシナリオ用に投稿されたソリューションは、必要な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を調整できます。
この投稿にたどり着く他の人たちの助けになることを願っています。
ここに問題と解決策があります
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;
これで問題が解決します。
IQueryableは単一のintではなく、コレクションを表すことができるクエリです。
エラーメッセージに示されているように、LinqクエリはSystem.Linq.IQueryableを返します(すべての意図と目的のためにintのコレクション)。それらのいずれかを取得する場合は、 First または ElementAt(n) を呼び出して、n番目の要素を取得できます。
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID