转换为LINQ To Entity查询中的类型

时间:2012-04-20 15:17:12

标签: c# linq casting

我有这个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(这是第一个查询的结果)执行另一个查询,该查询提取城市中{@ 1}}和FirstName的市长键> 20

LastName

问题是我得到了一个构建错误,即city.Mayor不包含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的定义

我试图将它转换为查询中的Mayor类型:

LastName

应用程序构建并正常启动,但是我收到运行时错误,我无法将其转换为LINQ查询中的类型。

我该如何解决这个问题?有没有办法在查询中进行转换,还是有其他解决方案。

非常感谢您的帮助

2 个答案:

答案 0 :(得分:3)

此部分查询的结果不是单个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实例。

请注意,如果未找到市长,则使用FirstOrDefault将返回 null ,而First()将抛出异常,但未找到市长。这些选择取决于您的情况。

答案 1 :(得分: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();