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

现在我想对Cities(这是第一个查询的结果)进行另一个查询,该查询提取具有键 > 20 的城市中的市长的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();

问题是我得到一个构建错误 city.Mayor 不包含FirstName和的定义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实例。

请注意,如果没有找到市长,usingFirstOrDefault将返回null,而如果没有找到市长,First()则会抛出异常。这些之间的选择取决于您的情况。

于 2012-04-20T15:21:34.393 回答
2

您不想分配IEnumerable<Mayor>给市长,而是选择一个项目。使用带有谓词的 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 回答