es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar por el más reciente de la colección anidada.

Tengo una aplicación de Entity Framework (.NET 6) (usando Azure SQL) que administra un evento y muestra una tabla de clasificación. Realiza un seguimiento de los participantes y las acciones que deben completarse en orden. Los pasos del evento se definen en la clase Steps, y luego la clase Action registra a los participantes que completan los pasos relevantes. El modelo de datos es básicamente el siguiente:

public class Participant
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<action> Actions { get; set; } = new();
}

public class Step
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }
}

public class Action
{
    public Guid Id { get; set; }
    public Participant Participant { get; set; }
    public Step Step { get; set; }
    public DateTime When { get; set; }
}

Lo que estoy tratando de hacer es mostrar una tabla de clasificación con los siguientes campos:
– Nombre del participante
– Paso
– Tiempo transcurrido en formato H:mm

Estoy teniendo dificultades para armar una consulta que esté correctamente ordenada. Fácilmente podría hacer lo siguiente:

var results = await _context.Participants
    .Include(p => p.Actions.OrderByDescending(a => a.Step.Number).Take(1))
        .ThenInclude(a => a.Step)
    .ToListAsync();

Esto obtiene el paso más reciente completado para cada participante. Sin embargo, ahora necesito ordenar a los participantes por este paso. Podría tomar este conjunto de resultados y ordenarlo después de materializar la consulta, pero estoy tratando de encontrar una forma de que el ordenamiento se haga en la consulta de la base de datos misma, y sin tener que definir un nuevo modelo para manejar los resultados.

¿Hay alguna forma de lograr esto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes utilizar el método OrderBy para ordenar los resultados por el número del paso completado por cada participante. Para hacer esto, puedes incluir la propiedad de navegación Step en tu consulta y utilizar el método OrderByDescending para ordenar por el número del paso, como se muestra a continuación:

    var results = await _context.Participants
        .Include(p => p.Actions
                .OrderByDescending(a => a.Step.Number)
                .Take(1)
                .Select(a => a.Step))
        .OrderBy(p => p.Actions.First().Step.Number)
        .Select(p => new {
            NombreParticipante = p.Name,
            NombrePaso = p.Actions.First().Step.Name,
            TiempoTranscurrido = (p.Actions.First().When - p.Actions.First().Step.When).ToString("h:mm")
        })
        .ToListAsync();
    

    Esta consulta obtendrá el paso completado más recientemente y ordenará a los participantes por el número del paso. El método Select se utiliza para proyectar los campos deseados en un tipo anónimo con los campos requeridos. El campo TiempoTranscurrido calcula el tiempo que tardó el participante en completar el paso restando el valor de Step.When al valor de Action.When y formateando el resultado como una cadena.

Comments are closed.