2011-09-06 47 views
8

Estoy tratando de ejecutar el siguiente bit de código, pero la comparación falla al no entregar mis entidades a las esperadas.Forma simple de comparar Fechas en el atributo DateTime usando Entity Framework 4 y consultas de Linq

Está comparando 06/09/2011 0:00:00 a 06/09/2011 12:25:00, siendo este último el valor de mi base de datos. Así que esa es la razón por la cual la comparación está fallando y no estoy obteniendo los registros que necesito.

Estoy tratando de comparar si las fechas coinciden, no me importa la hora.

DateTime today = DateTime.Now.Date; 
var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true || a.StartTime.Value == today) 
         .ToList(); 

¿Cómo puedo comparar solo las fechas?

Si utilizar la propiedad .Date en la parte .StartTime.Value, me sale una excepción:

El tipo de miembro 'Fecha' especificado no está soportado en LINQ a Entidades. Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades .

+0

¿Tal vez esta pregunta te ayude? LINQ | ¿Cómo realizo la comparación de fechas en una consulta de Linq? http://stackoverflow.com/questions/1088212/linq-how-do-i-perform-date-comparison-in-a-linq-query – Kyle

Respuesta

16

Se pueden utilizar los miembros individuales:

var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true 
            || (a.StartTime.Value.Year == todayYear 
             && a.StartTime.Value.Month == todayMonth 
             && a.StartTime.Value.Day == todayDay)) 
         .ToList(); 

... o utilizar cualquiera de the other methods/properties supported in L2E.

+0

Se está utilizando para el mismo operador. ¿Qué pasa si necesito verificar mayor que y menor que el operador? –

-1

tratar

DateTime todayStart = DateTime.Now.Date; 
DateTime todayEnd = DateTime.Now; 
var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true || (a.StartTime.Value >= todayStart && a.StartTime.Value <= todayEnd)) 
         .ToList(); 
11

También puede utilizar EntityFunctions.TruncateTime() bajo el espacio de nombres System.Data.Objects

Ex.

db.Orders.Where(i => EntityFunctions.TruncateTime(i.OrderFinishDate) == EntityFunctions.TruncateTime(dtBillDate) && i.Status == "B") 

Obras como encanto.

+1

¿Cómo se escriben UnitTests? –

+0

EntityFunctions ahora están obsoletas, ¡utilice DbFunctions en su lugar! –

Cuestiones relacionadas