1

私はこのLINQクエリを持っています

var Cities= (from city in AllCities
    where (city.NumberOfCitizens > 1000)
    select new
    {
        Mayor= (from mayor in AllMayors where mayor.CityKey == city.Key select mayor),
        Name = city.Name,
        Country = city.Country,
        Key = city.Key
        }).ToList();

市民が 1000 人を超える都市から、市長、名前、国、およびキーを選択します。

Mayorは、2 つのプロパティを持つクラスでありString FirstNameString LastName

ここで、キーが 20 を超える都市の市長のandCitiesを抽出する (最初のクエリの結果である) に対して別のクエリを実行したいと考えています。FirstNameLastName

var Result= (from city in Cities
    where (city.Key> 20)
    select new
    {
        MayorFirstName = city.Mayor.FirstName,
        MayorLastName = city.Mayor.LastName,
        City = city.Name
        }).ToList();

FirstName問題は、city.Mayor におよびの定義が含まれていないというビルド エラーが発生することです。LastName

クエリ内で Mayor タイプにキャストしようとしました。

Mayor= (Mayor)(from mayor in AllMayors where mayor.CityKey == city.Key select mayor),
.......

アプリケーションは正常にビルドされて起動しますが、LINQ クエリ内の型にキャストできないというランタイム エラーが発生します。

どうすればこの問題を解決できますか? クエリ内でキャストする方法はありますか、それとも他の解決策がありますか。

助けてくれてありがとう

4

2 に答える 2

4

クエリのこの部分の結果は単一のMayorオブジェクトではありませんが、IEnumerable<Mayor>

Mayor = (from mayor in AllMayors where mayor.CityKey == city.Key select mayor)

この行を次のように変更します。

Mayor= (from mayor in AllMayors where mayor.CityKey == city.Key select mayor).FirstOrDefault()

その場合、Mayor プロパティは単一のMayorインスタンスになります。

市長が見つからない場合、 usingはnullFirstOrDefaultを返しますが、市長が見つからない場合は例外をスローすることに注意してください。これらのどちらを選択するかは、状況によって異なります。First()

于 2012-04-20T15:21:34.393 に答える
2

を Mayorに割り当てる代わりにIEnumerable<Mayor>、1 つの項目を選択します。それを行うには、述語で Enumerable.First() を使用します。

Mayor = AllMayors.FirstOrDefault(mayor => mayor.CityKey == city.Key)

あなたの例では:

var Cities= (from city in AllCities
             where (city.NumberOfCitizens > 1000)
             select new
             {
               Mayor= AllMayors.FirstOrDefault(mayor => mayor.CityKey == city.Key),
               Name = city.Name,
               Country = city.Country,
               Key = city.Key
             }).ToList();
于 2012-04-20T15:21:26.537 に答える