2010-05-09 4 views
5

У меня есть бизнес-объект структурированы следующим образом:запросов LINQ с 3 уровней

Страна имеет государство, государство Город

Так Country[2].States[7].Cities[5].Name будет New York

Хорошо, мне нужно, чтобы получить список все объекты страны, которые имеют не менее 1 City.IsNice == true

Как это получить?

ответ

3
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)); 
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

Это дает города, а не страны. – brickner

+0

@brickner: поспешили немного;) – abatishchev

+0

Этот запрос возвращает страну для * каждого * приятного города ... Так например, если у вас 10 хороших городов в стране, этот запрос вернет ту же страну 10 раз –

0

Я хотел бы сделать это одним из двух способов:

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(country => 
        country.States.FirstOrDefault(state => 
                state.Cities.FirstOrDefault(city => 
                       city.IsNice) != null) != null); 
+0

, второй - не linq, он просто использует те же методы расширения, что и LINQ, используя –

+0

@Rune FS: linQ, а не linK;) – abatishchev

+0

@abatishchev хотя бы я получил второй справа :) (thx) –

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

это возвращает города, а не страны –

Смежные вопросы