我对其他答案之一感到困惑。您的查询都返回一个简单的城市列表,如果这就是您所需要的,那么您如何链接SelectManys 并不重要。我认为这是唯一正确的答案。
将第二个SelectMany 替换为Select 会显着改变查询结果。它返回按国家分组的嵌套城市列表。所以我不确定这如何回答你的问题。
在其他情况下,括号的放置方式很重要。在第一个查询中,continents.SelectMany(continent => continent.Countries) 部分列出了国家,之后,大陆超出了范围。在第二个查询中,大陆可以一直保持在范围内。
差异在查询语法中得到了最好的体现。假设您要列出所有大洲的国家和城市名称。在查询语法中:
from continent in Continents
from country in continent.Countries
from city in country.Cities
select
new
{
country.CountryName,
city.CityName
}
在方法语法中,这相当于:
Continents.SelectMany(continent => continent.Countries)
.SelectMany(country => country.Cities,
(country, city) => new
{
CountryName = country.CountryName,
CityName = city.CityName
} )
如您所见,它在第一个 SelectMany 的右括号之后添加了一个 Selectmany,就像在您的第一个查询中一样。范围内只能保留国家/地区。
如果您想列出国家名称和城市名称之外的大陆名称,您可以在方法语法中使用第二个查询的重载:
Continents.SelectMany
(
continent => continent.Countries.SelectMany
(
c => c.Cities
, (country, city) => new { country, city }
), (continent, x) => new
{
continent.ContinentName,
x.country.CountryName,
x.city.CityName
}
)
同样,查询语法看起来更友好:
from continent in Continents
from country in continent.Countries
from city in country.Cities
select
new
{
continent.ContinentName,
country.CountryName,
city.CityName
}
但是编译的方法语法在传递中间匿名类型时有点不同:
Continents.SelectMany(continent => continent.Countries,
(continent, country) => new { continent = continent, country = country } )
.SelectMany(x => x.country.Cities,(x, city) =>
new
{
ContinentName = x.continent.ContinentName,
CountryName = x.country.CountryName,
CityName = city.CityName
}
)
这是您第一个查询的变体。
所以如何链接SelectManys 取决于最终结果中您需要哪些实体。查询语法的好处是编译器会为您计算出来。