Gruppo annidato per LINQ

Non riesco a risolvere questo problema con la query LINQ.

Quindi abbiamo la struttura della tabella come segue: Id || bug_category || bug_name || bug_details || bug_priority

Voglio raggruppare per bug_category prima. Per ogni bug_category, voglio a turno raggruppare per bug__priority.

Quindi in pratica voglio qualcosa come:

bug_category = AUDIO :: No di BUGS -> Critical = 3, Medium = 2 e Low = 7 bugs.
bug_category = VIDEO :: No di BUGS -> Critical = 5, Medium = 1 e Low = 9 bugs.

La query seguente restituisce tutte le combinazioni univoche di categoria AND customer_priority:

(dove RawDataList è semplicemente un elenco di dati che ha la struttura sopra menzionata)

var ProceesedData = from d in RawDataList group d by new { d.bug_category, d.bug_priority } into g select new { g.Key.bug_category, g.Key.bug_priority }; 

La query seguente restituisce la categoria seguita da un elenco di record in quella categoria:

  var ProceesedData = from d in RawDataList group d by d.bug_category into g select new { g.Key, records = g }; 

Ma non riesco a procedere ulteriormente poiché ProcessedData (la variabile di ritorno) è un tipo sconosciuto. Qualche idea su questo?

Sospetto che tu voglia (i nomi sono cambiati per essere più idiomatici):

 var query = from bug in RawListData group bug by new { bug.Category, bug.Priority } into grouped select new { Category = grouped.Key.Category, Priority = grouped.Key.Priority, Count = grouped.Count() }; 

Poi:

 foreach (var result in query) { Console.WriteLine("{0} - {1} - {2}", result.Category, result.Priority, result.Count); } 

In alternativa (ma vedi dopo):

 var query = from bug in RawListData group bug by new bug.Category into grouped select new { Category = grouped.Category, Counts = from bug in grouped group bug by grouped.Priority into g2 select new { Priority = g2.Key, Count = g2.Count() } }; foreach (var result in query) { Console.WriteLine("{0}: ", result.Category); foreach (var subresult in result.Counts) { Console.WriteLine(" {0}: {1}", subresult.Priority, subresult.Count); } } 

EDIT: come indicato nei commenti, questo si tradurrà in più query SQL. Per ottenere una struttura dei risultati simile ma in modo più efficiente è ansible utilizzare:

 var dbQuery = from bug in RawListData group bug by new { bug.Category, bug.Priority } into grouped select new { Category = grouped.Key.Category, Priority = grouped.Key.Priority, Count = grouped.Count() }; var query = dbQuery.ToLookup(result => result.Category, result => new { result.Priority, result.Count }; foreach (var result in query) { Console.WriteLine("{0}: ", result.Key); foreach (var subresult in result) { Console.WriteLine(" {0}: {1}", subresult.Priority, subresult.Count); } } 

Questo è un modo più semplice per realizzare raggruppamenti nidificati. L’ho testato per le raccolte di memoria, indipendentemente dal fatto che il particolare provider DB possa gestirle o meno, oppure che sia sconosciuto o meno.

Supponendo che tu avessi due proprietà e volessi raggruppare per Stato e per Paese:

 var grouped = People .GroupBy(l => new { l.State, l.Country})//group by two things .GroupBy(l=> l.Key.Country)//this will become the outer grouping foreach(var country in grouped) { foreach(var state in country) { foreach(var personInState in state) { string description = $"Name: {personInState.Name}, State: {state.StateCode}, Country: {country.CountryCode}"; ... } } } 

Penso che tu stia cercando qualcosa del genere:

  var processedData = rawData.GroupBy(bugs => bugs.bug_category, (category, elements) => new { Category = category, Bugs = elements.GroupBy(bugs => bugs.bug_priority, (priority, realbugs) => new { Priority = priority, Count = realbugs.Count() }) }); foreach (var data in processedData) { Console.WriteLine(data.Category); foreach (var element in data.Bugs) Console.WriteLine(" " + element.Priority + " = " + element.Count); } 

Puoi farlo in questo modo

  var retList = (from dbc in db.Companies where dbc.IsVerified && dbc.SellsPCBs && !dbc.IsDeleted && !dbc.IsSpam && dbc.IsApproved select new { name = dbc.CompanyName, compID = dbc.CompanyID, state = dbc.State, city = dbc.City, businessType = dbc.BusinessType }).GroupBy(k => k.state).ToList(); List finalList = new List(); foreach (var item in retList) { finalList.Add(item.GroupBy(i => i.city)); }