Tengo una consulta SQL en funcionamiento que devuelve los resultados que quiero en SQL Server:
SELECT SUM(CriticalCount) As CriticalCount, SUM(HighCount) As HighCount, SUM(MediumCount) As MediumCount, SUM(LowCount) As LowCount, Timestamp FROM [dbo].[TicketCounts] GROUP BY Timestamp ORDER BY Timestamp DESCEl conjunto de resultados es:
| Recuento crítico | HighCount | Recuento medio | LowCount | marca de tiempo |
|---|---|---|---|---|
| 32 | 15 | 18 | 3 | 2021-07-01 11:00:00 |
| 24 | 10 | 42 | 15 | 2021-06-30 10:00:00 |
En mi TicketCountRepository de mi proyecto .Net Core 5.0, quiero que este método devuelva los mismos resultados:
public async Task<IEnumerable<TicketCount>> GetTicketCounts() { return await _dbContext.TicketCounts .GroupBy(o => o.Timestamp) .Select(tc => new TicketCount { CriticalCount = tc.Sum(o => o.CriticalCount), HighCount = tc.Sum(o => o.HighCount), MediumCount = tc.Sum(o => o.MediumCount), LowCount = tc.Sum(o => LowCount) }).OrderByDescending(o => o.Timestamp).toListAsync(); } El código se compila bien, pero cuando presiono este método en el controlador TicketCount , aparece un error 500:
System.InvalidOperationException: la expresión LINQ DbSet().GroupBy(keySelector: o => o.Timestamp, elementSelector o => o).Select(e => new TicketCount { CriticalCount = e.Sum(s => s.CriticalCount) , HighCount = e.Sum(s => s.HighCount), MediumCount = e.Sum(s => s.MediumCount), LowCount = e.Sum(s => s.LowCount)}).OrderByDescending(e0 => e0.Timestamp) no se pudo traducir. Vuelva a escribir la consulta en un formulario que se pueda traducir o cambie a la evaluación del cliente explícitamente insertando una llamada a 'AsEnumerable', 'AsAsyncEnumerable', 'ToList' o 'ToListAsync'.
¿Qué estoy haciendo mal? ¿Debo usar algo que no sea linq para obtener el conjunto de resultados necesario?
El tipo que está consultando es incorrecto, es el tipo de retorno en lugar del tipo que contiene los datos sin procesar. Quieres algo como:
return await _dbContext.Tickets .GroupBy(o => o.Timestamp) .Select(x => new TicketCount { Timestamp = x.Key, CriticalCount = x.Sum(o => o.CriticalCount), HighCount = x.Sum(o => o.HighCount), MediumCount = x.Sum(o => o.MediumCount), LowCount = x.Sum(o => LowCount) }).OrderByDescending(x => x.Timestamp).toListAsync();Como no selecciona la marca de tiempo, muévala antes de seleccionar
return await _dbContext.TicketCounts .GroupBy(o => o.Timestamp) .OrderByDescending(o => o.Timestamp) .Select(tc => new TicketCount { CriticalCount = tc.Sum(o => o.CriticalCount), HighCount = tc.Sum(o => o.HighCount), MediumCount = tc.Sum(o => o.MediumCount), LowCount = tc.Sum(o => LowCount) }).ToListAsync();o puede intentar agregar la propiedad Timestamp a TicketCount y agregarla a Select.