2016-08-22 4 views
3

Comment groupe Sous-groupe pour créer la liste des continents où chaque continent a ses propres comtés et chaque pays a ses propres villes comme ce tableauLINQ: Groupement SubGroup

enter image description here

Voici le 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 

et le résultat de t-sql:

enter image description here

J'ai essayé, mais il regroupe les données de mauvaise façon j'ai besoin de regrouper exactement comme le tableau ci-dessus

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

Il se regroupe dans le mauvais sens? En quoi est-ce mal? –

+0

Je ne vois même pas de groupe dans le T-SQL. – juharr

+0

Je pense que vous devez regrouper à nouveau dans la projection des premiers groupes: 'Result.GroupBy (x => x.ContinentName) .Sélectionnez (g => g.GroupBy (x => x.CountryName))'. –

Répondre

4

Vous devez groupe tout par continent, ceux-ci par pays et les pays par ville:

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

Merci Tim! Vous m'aidez toujours mon bon ami !! Ceci est exactement ce que je cherchais. Que penses-tu du regroupement de cette façon avec Linq, est-ce bien, ou devrais-je regrouper en serveur sql au lieu de Linq? mon autre question est: je suis un nouveau développeur quel est votre conseil pour moi de devenir développeur vraiment professionnel comme :)? – Lucy

+0

J'ai passé deux jours à chercher comment regrouper cela dans le serveur sql mais je n'ai trouvé aucun article utile. – Lucy

+0

Même si vous regroupez dans la base de données, vous n'obtiendrez pas votre structure imbriquée, donc votre approche actuelle est correcte. Une autre approche consisterait à classer les résultats dans la base de données par continent, pays et ville. Ensuite, une boucle simple et efficace serait suffisante pour créer votre liste. –

1

Vous devez appliquer le regroupement deux fois

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

Cela a fonctionné, merci beaucoup:) ... Mais je ne comprends pas var grouped = Résultat .GroupBy (x => x.CountryName .GroupBy (x => x.First(). ContinentName); Pouvez-vous s'il vous plaît me dire un moyen plus facile de le grouper? quelque chose comme ce que j'ai utilisé dans mon code ... merci – Lucy