2010-05-09 11 views
5

he un objeto de negocio estructurados de esta manera:LINQ consultas con 3 niveles

País tiene Unidos, Estado tiene ciudades

Así Country[2].States[7].Cities[5].Name habría New York

Ok, necesito obtener una lista de todos los objetos Country que tienen al menos 1 City.IsNice == true

¿Cómo obtengo eso?

Respuesta

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

Otra opción:

var selectedCountries = 
    countries.Where(
     co => co.States.SelectMany(s => s.Cities).Any(
      ci => ci.IsNice)); 
1
var result = (from country in db.Countries 
      from state in country.States 
      from city in state.Cities 
      where city.IsNice 
      select county).Distinct(); 
+0

Esto le da a las ciudades y no a los países. – brickner

+0

@brickner: se han apresurado un poco;) – abatishchev

+0

Esta consulta devuelve el país para * cada * ciudad agradable ... Por ejemplo, si tiene 10 ciudades agradables en un país, esta consulta devolverá el mismo país 10 veces –

0

lo haría en una de dos maneras:

var selectedCountries = from country in countries 
         from state in country.States 
         from city in state.Cities 
         where city.IsNice 
         select country; 

o

var selectedCountries = 
    countries.Where(country => 
        country.States.FirstOrDefault(state => 
                state.Cities.FirstOrDefault(city => 
                       city.IsNice) != null) != null); 
+0

la segunda no es linq simplemente está usando los mismos métodos de extensión que LINQ está usando –

+0

@Rune FS: linQ, no linK;) – abatishchev

+0

@abatishchev al menos tengo la el segundo derecho :) (thx) –

0
var result = Countries 
    .SelectMany(a => a.States) 
    .SelectMany(b => b.Cities) 
    .Where(b => b.IsNice == true) 
    .ToList(); 
+0

esto devuelve las ciudades, no los países –