按内部列表数据分组

时间:2017-12-07 07:42:35

标签: c# .net linq lambda

我在编写查询以通过内部列表数据创建组来过滤外部列表时遇到问题。 我有一个像

这样的集合结构


    "products"
    {
            "id": "97",        
            "name": "YI1",        
            "projects": [
                {

                    "id": "92",                
                    "name": "MUM",
                    "branches": [
                        {                        
                            "id": "62",                        
                            "name": "ON Service",
                            "geographyid": "84",
                            "geographyname": "North America",
                            "countryid": "52",
                            "countryname": "Canada"                  
                        }
                    ],
                    "customers": [
                        {
                            "id": "80",
                            "name": "HEALTH SCIENCES"
                        }
                    ]

                }
            ],       

        },
        "products"
        {
            "id": "96",        
            "name": "YI2",        
            "projects": [
                {

                    "id": "94",                
                    "name": "HHS",
                    "branches": [
                        {                        
                            "id": "64",                        
                            "name": "Hamilton ON Service",
                            "geographyid": "44",
                            "geographyname": "Asia",
                            "countryid": "58",
                            "countryname": "China"                  
                        }
                    ],
                    "customers": [
                        {
                            "id": "40",
                            "name": "SCIENCES"
                        }
                    ]

                }
            ],            
            ]
        }

我正在尝试新的集合,可以返回如下输出



    "Geography"{
        "geographyid": "44",
        "geographyname": "Asia",
        "Country"
        {

            "countryid": "58",
            "countryname": "China",
            "branches"
            {           
                "id": "94",                
                "name": "HHS
                "customers"
                {
                    "id": "40",
                    "name": "SCIENCES"

                    "projects"
                    {
                        "id": "94",                
                        "name": "HHS",
                        "products"
                        {
                            "id": "96",        
                            "name": "YI2", 
                        }
                    }
                },
            }
        }
    },
    "Geography"{
        "geographyid": "84",
        "geographyname": "North America"
        "Country"
        {
            "countryid": "52",
            "countryname": "Canada" 
            "branches"
            {           

                "id": "62",                        
                "name": "ON Service",
                "customers"
                {
                    "id": "80",
                     "name": "HEALTH SCIENCES"

                    "projects"
                    {
                        "id": "92",                
                        "name": "MUM",
                        "products"
                        {
                            "id": "97",        
                            "name": "YI1", 
                        }
                    }
                },
            }
        }
    }


我尝试了多个选项并写下面的查询,但我仍然没有得到所需的结果。

var treeGroup = siteList.SelectMany(a => a.projects.Select(b => new { A = a, B = b }).ToList()).ToList()
 .GroupBy(ol => new { ol.B.geographyid, ol.B.geographyname })
 .Select(gGroup => new TreeNodes
 {
     id = gGroup.Key.geographyid,
     name = gGroup.Key.geographyname,
     type = Costants.geographyTreeNode,
     parentid = string.Empty,
     children = gGroup
         .GroupBy(ol => new { ol.B.countryid, ol.B.countryname })
         .Select(cGroup => new TreeNodes
         {
             id = cGroup.Key.countryid,
             name = cGroup.Key.countryname,
             type = Costants.countryTreeNode,
             parentid = gGroup.Key.geographyid,
             children = cGroup
               .GroupBy(ol => new { ol.B.id, ol.B.name })
               .Select(sGroup => new TreeNodes
               {
                   id = sGroup.Key.id,
                   name = sGroup.Key.name,
                   type = Costants.branchTreeNode,
                   parentid = cGroup.Key.countryid,
                   children = sGroup
                    .Select(ol => new TreeNodes { id = ol.A.id, name = ol.A.name, type = Costants.siteTreeNode, parentid = sGroup.Key.id, children = new List<TreeNodes>() })
                    .ToList()
               })
              .ToList()
         })
         .ToList()
 })
 .ToList();

我可以使用循环逻辑来获得结果,但我想避免它并尝试使用linq或lmbda表达式。

1 个答案:

答案 0 :(得分:0)

我能够解决这个问题。我为客户提供了一些额外的参数,然后在分支机构的selectmany函数中使用了相同的参数