C # Linq donde fecha entre 2 fechas


81

Estoy tratando de obtener mi declaración de linq para obtener todos los registros entre dos fechas, y no estoy muy seguro de lo que necesito cambiar para que funcione: (a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

Respuestas:


148

Solo cámbialo a

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)

4
Hola @Giorgi: El miembro de tipo especificado 'Fecha' no es compatible con LINQ to Entities.
PeaceInMind

2
Hola @admin, la solución para esto es no especificar la función Fecha en las propiedades de la tabla. Por ejemplo: db.Invoices.Where (w => w.Date> = Date1.Date && w.Date <= Date2.Date) .ToList (). Funcionará;)
JD - DC TECH

@ user1502624 Eso no funciona en la línea principal de EF y he visto el código fuente para eso. Hice una rama que funciona. Funciona convirtiendo la .Datellamada en una EntityFunctions.TruncateDatellamada.
Aron

Esta consulta omitirá las citas que comienzan antes de la fecha de inicio y terminan después de la fecha de finalización; Citas de varios días que deben incluirse. Si necesita una consulta que incluya tales posibilidades, eche un vistazo a la "segunda consulta" aquí stackoverflow.com/a/7815706/4040647 por @Enigmativity
Mark Sizer

27
var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID
                        where a.Start.Date >= startDate.Date
                        where a.Start.Date <= endDate.Date

6
var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();

1

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
        {
            List<tbltask> tbtask = new List<tbltask>();
            DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
            DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
            tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
                Where(x => x.tblproject.company_id == c
                    && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                    && (statusid == 0 || statusid == x.tblstatu.StatusId)
                    && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                    && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();



            return tbtask;


        }

esta es mi consulta para registros de búsqueda basados ​​en datos de búsqueda y entre la fecha de inicio y finalización


1

Si alguien está interesado en saber cómo trabajar con 2 listas y entre fechas

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))

1

Si tiene una condición de filtro de intervalo de fechas y necesita seleccionar todos los registros que caen parcialmente en este rango de filtro. Supuesto: los registros tienen la propiedad ValidFrom y ValidTo.

DateTime intervalDateFrom = new DateTime(1990, 01, 01);
DateTime intervalDateTo = new DateTime(2000, 01, 01);

var itemsFiltered = allItems.Where(x=> 
    (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
    (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
    (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
    (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
);

0

Entonces, se está desplazando hacia abajo porque las Respuestas no funcionan:

Esto funciona como magia (pero dicen que tiene problemas de eficiencia para big data, y a ti no te importa como a mí)

1- El tipo de datos en la base de datos es "datetime" y "anulable" en mi caso.

El formato de datos de ejemplo en DB es como:

2018-11-06 15:33:43.640

Un en C # cuando se convierte en cadena es como:

2019-01-03 4:45:16 PM

Entonces el formato es:

yyyy/MM/dd hh:mm:ss tt

2- Por lo tanto, primero debe preparar sus variables de fecha y hora en el formato adecuado:

Ejemplo 1

yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")

Ejemplo 2: intervalo de fecha y hora de los últimos 30 días

    DateTime dateStart = DateTime.Now.AddDays(-30);
    DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);

3- Finalmente la consulta linq que perdiste tu día tratando de encontrar (Requiere EF 6)

using System.Data.Entity;

_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();

Para tener en cuenta la comparación de tiempos también:

(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)

Tenga en cuenta que el siguiente método mencionado en otras preguntas y respuestas de stackoverflow no funcionará correctamente:

....
&&
(
    s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
    s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
    s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();

Si el día de inicio fue en este mes, por ejemplo, y el día de finalización es en el mes siguiente, la consulta devolverá falso y ningún resultado, por ejemplo:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

startDate = 2018/12/01

EndDate = 2019/01/04

la consulta siempre buscará días entre 01 y 04 sin tener en cuenta el "mes", por lo que "s.Created_at.Value.Day <= dateEnd.Day" fallará

Y en caso de que tenga realmente grandes datos, ejecutaría Native SQL Query en lugar de linq

...
    ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
    ....

Gracias


Aún no recibo los elementos correctos en el rango de fechas.
Adam Ri

0

Tuve un problema para que esto funcionara.

Tenía dos fechas en una línea de base de datos y necesito agregarlas a una lista para ayer, hoy y mañana.

esta es mi solución:

        var yesterday = DateTime.Today.AddDays(-1);
        var today = DateTime.Today;
        var tomorrow = DateTime.Today.AddDays(1);            
        var vm = new Model()
        {
            Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
            Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
            Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
        };
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.