Obtener registro entre rangos de fechas con LINQ

publicado por: Anonymous

Tengo una tabla con registros que mantienen reservas de horas tomadas por pacientes, en base a un ID. y que por cada registro se establece una hora en formato DateTime (DD/MM/AAAA HH:MM:ss:MSS)
En un servicio ApiRest (en c#) estoy recibiendo como parámetro una entidad con los siguientes datos

{
    "Usuario" : "Usuario test",
    "Inicio" : "2019-03-07 10:30:00", 
    "Reserved" : "false"
}

Para poder agregar el registro en la tabla, debo validar que la hora entregada como parámetro mas 1 hora, no se encuentre dentro del rango horario de la base en algún registro. Es decir:

Si en la base existen los siguientes registros

Usuario, HoraReserva, Reserved
User1, 2019/03/07 08:00:00, true
User1, 2019/03/07 10:00:00, true
User1, 2019/03/07 15:00:00, true

La consulta debería devolverme el 2do registro ya que como la entidad pasada como parámetro tiene las 10:30:00 al sumar 1 hora su fin sería a las 11:30:00, y este rango de horas estaría dentro del rango de horas (hora de inicio + 1 hora) del segundo registro.

He estado intentando con la siguiente consulta, pero no me trae registros.

DateTime Inicio = Parametro.Inicio;
DateTime termino = Parametro.Inicio.Add(new TimeSpan(1, 0, 0));
var result = _context.Horas.Where(x => x.Inicio >= Inicio && x.Inicio.Add(new TimeSpan(1, 0, 0)) <= termino);

La fecha corresponde, pero no es posible ubicar el rango horario del 2do registro.

solución

no te entrega ningún registro por que no hay ningún registro que cumpla lo siguiente

var result = _context.Horas.Where(x => x.Inicio >= '10:30' && x.Inicio.Add(new TimeSpan(1, 0, 0))  <= '11:30');

si bien tienes un registro mayor a las 1030 (el registro de las 15), agregas al where que ese registro además sea menor a las 1130 (termino), por lo cual ningún registro cumple.

para que cumpla la condición que necesitas debes agregar +1 hora a x.inicio de comparación con la fecha de input (10:30) y agregar un FirstOrDefault():

var result = _context.Horas.Where(x => x.Inicio.Add(new TimeSpan(1, 0, 0)) >= Inicio && x.Inicio.Add(new TimeSpan(1, 0, 0)) <= termino).FirstOrDefault();
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *