具有3个级别的LINQ查询

具有3个级别的LINQ查询,linq,Linq,我有一个如下结构的业务对象: 国家有州,州有城市 因此,国家[2]。州[7]。城市[5]。名称将是纽约 好的,我需要获得至少有1个城市的所有国家/地区对象的列表。IsNice==true 我怎样才能做到这一点呢?我会用以下两种方法之一: var result = (from country in db.Countries from state in country.States from city in state.Cities

我有一个如下结构的业务对象:

国家有州,州有城市

因此,
国家[2]。州[7]。城市[5]。名称将是纽约

好的,我需要获得至少有1个城市的所有国家/地区对象的列表。IsNice==true


我怎样才能做到这一点呢?

我会用以下两种方法之一:

var result = (from country in db.Countries
             from state in country.States
             from city in state.Cities
             where city.IsNice
             select county).Distinct();
var selectedCountries = from country in countries
                        from state in country.States
                        from city in state.Cities
                        where city.IsNice
                        select country;

另一种选择:

var selectedCountries =
    countries.Where(
        co => co.States.SelectMany(s => s.Cities).Any(
            ci => ci.IsNice));

这给了城市而不是国家。@brickner:有点匆忙;)此查询返回每个城市的国家/地区。。。例如,如果一个国家有10个不错的城市,这个查询将返回相同的国家10个times@Thomas谢谢你的评论<代码>不同的我想会有帮助。“不是吗?”托马斯·莱维斯克:是的,你的更好。但是OP要求使用LINQ,所以我在“纯”LINQ中使用了它。你的第二个不是LINQ,它只是使用了与LINQ相同的扩展方法,因为LINQ使用的都是LINQ。LINQ是.NET的一部分,C#3.0为其提供了语言扩展。来自维基百科():“虽然LINQ主要是作为.NET Framework 3.5的库实现的,但它还定义了一组语言扩展,可以选择由语言实现,使查询成为一流的语言构造,并为编写查询提供语法支持。这些语言扩展最初是在C#3.0、VB9.0和Oxygene中实现的,其他语言如F#和Nemerle已经宣布了初步支持。“此查询返回每个美丽城市的国家/地区。。。例如,如果你在一个国家有10个不错的城市,这个查询将返回同一个国家10次,第一个是正确的。这取决于你想要什么。如果你想让每个国家都出现一次,你可以使用Distinct()或使用我写的第二种方式(更有效)。事实上,我没有阅读第二个查询,因为我认为它与第一个查询的形式不同。但是,您应该使用Any而不是firstOrdefault。这将返回城市,而不是国家
var result = Countries
    .SelectMany(a => a.States)
    .SelectMany(b => b.Cities)
    .Where(b => b.IsNice == true)
    .ToList();
var selectedCountries =
    countries.Where(
        co => co.States.Any(
            s => s.Cities.Any(
                ci => ci.IsNice)));
var selectedCountries =
    countries.Where(
        co => co.States.SelectMany(s => s.Cities).Any(
            ci => ci.IsNice));