Search code examples
c#linqlinq-group

c# list Group By


I am getting domain related information as a simple list from database and now i need to group the information before binding to the view. Here is my Class details. I tried various group logic but could not get achieve the result

public class CapabilitySelectionModel
    {
        public string Domain { get; set; }
        public string Category { get; set; }
        public string Capability { get; set; }
    }

List<CapabilitySelectionModel> list1 = new List<CapabilitySelectionModel>();
            list1.Add(new CapabilitySelectionModel { Domain = "Domain1", Category = "Category1", Capability = "Capability1" });
            list1.Add(new CapabilitySelectionModel { Domain = "Domain1", Category = "Category1", Capability = "Capability2" });
            list1.Add(new CapabilitySelectionModel { Domain = "Domain1", Category = "Category2", Capability = "Capability1" });
            list1.Add(new CapabilitySelectionModel { Domain = "Domain2", Category = "Category1", Capability = "Capability1" });
            list1.Add(new CapabilitySelectionModel { Domain = "Domain2", Category = "Category2", Capability = "Capability1" });
            list1.Add(new CapabilitySelectionModel { Domain = "Domain2", Category = "Category2", Capability = "Capability2" });

It will look something like this

Domain1
    Category1
       Capability1
       Capability2
   Category2
       Capability1
Domain2
   Category1
     Capability1
   Category2
     Capability1
     Capability2

Now, i want this list to be converted to the below list format

public class DomainModel
    {
        public string DomainName { get; set; }
        public List<CategoryModel> CategoryModel { get; set; }
    }

 public class CategoryModel
    {
        public string CategoryName  {  get;  set;  }
        public List<CapablityModel> CapablityModel   { get; set;}
    }

public class CapablityModel
    {
        public string CapablityName {  get;  set; }
    }

Can someone advise?


Solution

  • Not tested, but you just need some nested Grouping:

    var results = list1
      .GroupBy(a => a.Domain)
      .Select(g => new DomainModel {        
               DomainName = g.Key,
               CategoryModel = g.GroubY(b => b.Category)
                  .Select(h => new CategoryModel {
                     CategoryName  = h.Key,
                     CapablityModel = h.Select( c => new CapablityModel { 
                         c.CapablityName }).ToList()
               }).ToList()
       }).ToList();