2016-08-22 2 views
3

Как группа ПОДГРУППЫ создать список континентов, где каждый континент имеет свои графства и каждую страна имеет свои собственные города, как эта таблицаLINQ: Группировка Подгруппа

enter image description here

Вот T-SQL:

select Continent.ContinentName, Country.CountryName, City.CityName 
from Continent 
left join Country 
on Continent.ContinentId = Country.ContinentId 

left join City 
on Country.CountryId = City.CountryId 

и результат T-SQL:

enter image description here

Я попытался это, но он группирует данные в неправильном направлении мне нужно сгруппировать так же, как выше таблице

var Result = MyRepository.GetList<GetAllCountriesAndCities>("EXEC sp_GetAllCountriesAndCities"); 

    List<Continent> List = new List<Continent>(); 


    var GroupedCountries = (from con in Result 
          group new 
          { 


           con.CityName, 

          } 

          by new 
          { 

           con.ContinentName, 
           con.CountryName 
          } 

      ).ToList(); 

    List<Continent> List = GroupedCountries.Select(c => new Continent() 
    { 

     ContinentName = c.Key.ContinentName, 
     Countries = c.Select(w => new Country() 
     { 
      CountryName = c.Key.CountryName, 

      Cities = c.Select(ww => new City() 
      { 
       CityName = ww.CityName 
      } 
      ).ToList() 

     }).ToList() 


    }).ToList(); 
+2

Это группируется не по-другому? Каким образом это неправильно? –

+0

Я даже не вижу группу в T-SQL. – juharr

+0

Думаю, вам придется снова сгруппировать в проекции первых групп: 'Result.GroupBy (x => x.ContinentName). Выберите (g => g.GroupBy (x => x.CountryName))'. –

ответ

4

Вы должны группировать все на континенте, они по странам и регионам по городам:

List<Continent> List = MyRepository.GetList<GetAllCountriesAndCities>("EXEC sp_GetAllCountriesAndCities") 
    .GroupBy(x => x.ContinentName) 
    .Select(g => new Continent 
    { 
     ContinentName = g.Key, 
     Countries = g.GroupBy(x => x.CountryName) 
        .Select(cg => new Country 
        { 
         CountryName = cg.Key, 
         Cities = cg.GroupBy(x => x.CityName) 
            .Select(cityG => new City { CityName = cityG.Key }) 
            .ToList() 
        }) 
        .ToList() 
    }) 
    .ToList(); 
+1

Спасибо Тим! Ты всегда помогаешь мне, мой хороший друг !! Это именно то, что я искал. Что вы думаете о том, чтобы группировать этот путь с Linq, это нормально, или мне нужно группировать в sql-сервере вместо Linq? мой еще один вопрос: я новый разработчик, что твой совет для меня стать действительно профессиональным разработчиком вроде :)? – Lucy

+0

Я потратил два дня на то, как сгруппировать их на сервере sql, но не смог найти полезную статью. – Lucy

+0

Даже если вы группируете в базу данных, вы не получите свою вложенную структуру, поэтому ваш текущий подход будет прекрасен. Другим подходом было бы упорядочить набор результатов в базе данных по континенту, стране и городу. Тогда для создания списка достаточно простого и эффективного цикла. –

1

Вы должны применять группировку дважды

var grouped = Result 
    .GroupBy(x => x.CountryName) 
    .GroupBy(x => x.First().ContinentName); 

var final = grouped.Select(g1 => new Continent 
{ 
    ContinentName = g1.Key, 
    Countries = g1.Select(g2 => new Country 
    { 
     CountryName = g2.Key, 
     Cities = g2.Select(x => new City { CityName = x.CityName }).ToList() 
    }).ToList() 
}); 
+0

Это сработало, большое вам спасибо:) ... Но я не понимаю var grouped = Результат .GroupBy (x => x.CountryName) .GroupBy (x => x.First(). ContinentName); Не могли бы вы рассказать мне более простой способ сгруппировать его? что-то вроде того, что я использовал в своем коде ... спасибо – Lucy

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