sumar - cómo agrupar por múltiples columnas usando linq
agrupar una lista con linq c# (1)
Esta pregunta ya tiene una respuesta aquí:
- Group By Multiple Columns 10 answers
Tengo una tabla de base de datos con un conjunto de datos que contiene varias filas de datos de la siguiente manera
ItemId Code StatusId
-------------------- ---------------------------------------------
62224 NC0860000 8
62225 NC0860000 8
62226 NC0860000 8
62227 NC0860200 5
62228 NC0860000 5
62229 NC0860000 5
62230 NC0860000 5
Lo que me gustaría lograr es un resultado de salida como
NC0860000 8 3 (code, status, count)
NC0860000 5 3
No entiendo completamente cómo funciona la agrupación en EF. Puedo obtener la clave y un conteo de un solo grupo usando una consulta como:
var results = (from ssi in ctx.StageSubmitItems
join s in ctx.StageSubmissions on ssi.SubmissionId equals s.SubmissionId
where s.ContributorCode == contributorId
group ssi.SubmitItemId by ssi.AgencyCode into g
select new {AgencyCode = g.Key, Count = g.Count() }).ToList();
Pero no puedo averiguar cómo agrupar por código y luego por StatusId y luego generar un conteo del número total de filas por estado.
Agradecería cualquier sugerencia sobre dónde buscar cómo lograr esto o lo que estoy haciendo incorrectamente en la consulta.
Gracias por adelantado
-Aclamaciones
Puede agrupar por una nueva clase anon de la siguiente manera:
// I created a Foo class to show this working
var fooList = new List<Foo> {
new Foo { ItemId = 62224, Code = "NC0860000", StatusId = 8 },
new Foo { ItemId = 62225, Code = "NC0860000", StatusId = 8 },
new Foo { ItemId = 62226, Code = "NC0860000", StatusId = 8 },
new Foo { ItemId = 62227, Code = "NC0860200", StatusId = 5 },
new Foo { ItemId = 62228, Code = "NC0860000", StatusId = 5 },
new Foo { ItemId = 62229, Code = "NC0860000", StatusId = 5 },
new Foo { ItemId = 62230, Code = "NC0860000", StatusId = 5 },
};
var results = (from ssi in fooList
// here I choose each field I want to group by
group ssi by new { ssi.Code, ssi.StatusId } into g
select new { AgencyCode = g.Key.Code, Status = g.Key.StatusId, Count = g.Count() }
).ToList();
// LINQPad output command
results.Dump();
Con los datos proporcionados, aquí está el resultado:
AgencyCode Status Count
NC0860000 8 3
NC0860200 5 1
NC0860000 5 3
Supongo que "NC0860200" es un error, pero está en los datos de muestra, así que lo incluí.