2015-06-25 14 views
5

I złożył następujące oświadczenie linqC# + EntityFramework: Konwersja wielu grupy przez zapytania do zagnieżdżonego JSON

C#

var list = from row in repository.GetAllEntities() 
         group row by new { row.RegionString, row.SubRegionString, row.CountryString } into g 
         select new { g.Key.RegionString, g.Key.SubRegionString, g.Key.CountryString, Count = g.Count() }; 

return Json(list, JsonRequestBehavior.AllowGet); 

która zwraca

[ 
    { 
    "RegionString":"Americas", 
    "SubRegionString":"", 
    "CountryString":"", 
    "Count":2 
    }, 
    { 
    "RegionString":"Americas", 
    "SubRegionString":"NorthAmerica", 
    "CountryString":"Canada", 
    "Count":5 
    }, 
    { 
    "RegionString":"Americas", 
    "SubRegionString":"NorthAmerica", 
    "CountryString":"US", 
    "Count":3 
    }, 
    { 
    "RegionString":"Americas", 
    "SubRegionString":"SouthAmerica", 
    "CountryString":"Chile", 
    "Count":3 
    }, 
    { 
    "RegionString":"EMEA", 
    "SubRegionString":"AsiaPacific", 
    "CountryString":"Australia", 
    "Count":2 
    }, 
    { 
    "RegionString":"EMEA", 
    "SubRegionString":"AsiaPacific", 
    "CountryString":"Japan", 
    "Count":1 
    }, 
    { 
    "RegionString":"EMEA", 
    "SubRegionString":"SouthernEurope", 
    "CountryString":"Turkey", 
    "Count":1 
    }, 
    { 
    "RegionString":"EMEA", 
    "SubRegionString":"WesternEurope", 
    "CountryString":"", 
    "Count":1 
    } 
] 

ale ja staram się zrobić w tym formacie:

[{ 
    name: "Americas", 
    children: [ 
    { 
     name: "NorthAmerica", 
     children: [{ "name": "Canada", "count": 5 }, 
        { "name": "US", "count": 3 }] 

    }, 
    { 
     name: "SouthAmerica", 
     children: [{ "name": "Chile", "count": 1 }] 
    }, 
    ], 
}, 
{ 
    name: "EMA", 
    children: [ 
    { 
     name: "AsiaPacific", 
     children: [{ "name": "Australia", "count": 2 }, 
        { "name": "Japan", "count": 1 }] 

    }, 
    { 
     name: "SouthernEurope", 
     children: [{ "name": "Turkey", "count": 1 }] 
    }, 
    ], 
}] 

Jak zmodyfikować wyciąg, aby uzyskać oczekiwany wynik? Odpowiedzi innych niż linq są również akceptowalne.

EDIT: Region jest rodzicem podregionu, podregion jest rodzicem Kraj i hrabia jest unikalna liczba elementów, które należy do Kraju

+0

czy możesz wyjaśnić, co próbujesz zrobić poza formatem? to znaczy. region podrzędny jest ciągiem znaków dla regionu –

+0

Wystarczy edytować odpowiedź w hierarchii. Mam nadzieję, że to jest pomocne. – tcigrand

+0

prawdopodobnie możesz to zrobić za pomocą słownika słowników, próbuję teraz znaleźć rozwiązanie –

Odpowiedz

7

Oto zapytanie LINQ chcesz (I Wcześniej usunięto -String postfix dla czytelności):

var list = 
    from entity in repository.GetAllEntities() 
    group entity by entity.Region into regions 
    let childrenOfRegions = 
     from region in regions 
     group region by region.SubRegion into subregions 
     let countriesOfSubRegions = 
      from subregion in subregions 
      group subregion by subregion.Country into countries 
      select new { Name = countries.Key } 
     select new { Name = subregions.Key, Children = countriesOfSubRegions } 
    select new { Name = regions.Key, Children = childrenOfRegions }; 

nie ma Count w tym zapytaniu, ponieważ ja naprawdę nie rozumiem, co się liczy.

To, co tu robię, to grupowanie wierszy w regiony, aw ostatnim wierszu można zobaczyć część, w której zwracam regiony.
Aby pozyskać dzieci, należy pogrupować regiony w subregiony (w ten sam sposób, co w przypadku regionów). Powtarzacie to aż do krajów i gotowe.