我有这个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 FirstName
和String 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查询中的类型。
我该如何解决这个问题?有没有办法在查询中进行转换,还是有其他解决方案。
非常感谢您的帮助
答案 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();