2015-06-25 31 views
5

我作了如下的LINQ聲明C#+的EntityFramework:通過查詢轉換多個組嵌套的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); 

返回

[ 
    { 
    "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 
    } 
] 

但我試圖讓它變成這種格式

[{ 
    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 }] 
    }, 
    ], 
}] 

我如何修改語句以獲得我要查找的結果?非linq答案也可以接受。

編輯:地區是次區域的父,次區域國家的父母和伯爵是唯一編號的項目屬於國家

+0

你能解釋一下你試圖在格式旁邊做什麼嗎?即。子區域是子區域字符串 –

+0

剛編輯了層次結構的答案。希望這是有幫助的 – tcigrand

+0

你可以做一個字典詞典,我現在試着做一個解決方案 –

回答

7

這裏是LINQ查詢你想(我已刪除該-String後綴的可讀性):

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 }; 

有在此查詢沒有Count,因爲我真的不明白你是什麼計數。

我在這裏做的是將行分組到各個區域中,在最後一行中,您可以看到我返回區域的部分,其中有
select new { Name = regions.Key, ... }部分。
爲了讓孩子們,你需要將區域分組成子區域(與區域相同的方式)。你一直重複這些到國家,你就完成了。