2009-07-06 37 views
40

Por favor ayuda. Estoy intentando averiguar cómo usar DATE o DATETIME para comparar en una consulta de linq.¿Cómo realizo la comparación de fechas en la consulta EF?

Ejemplo: Si quería todos los nombres de los empleados para los que comenzaron antes de hoy, me gustaría hacer algo como esto en SQL:

SELECT EmployeeNameColumn 
FROM EmployeeTable 
WHERE StartDateColumn.Date <= GETDATE() //Today 

Pero ¿qué pasa con LINQ?

DateTime startDT = //Today 

var EmployeeName = 
from e in db.employee 
where e.StartDateColumn <= startDT 

Lo anterior no funciona DONDE:

Detalles de la excepción: System.NotSupportedException: El miembro tipo especificado 'Date' no está soportado en LINQ a Entidades. Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades.

Respuesta

18

Eso debería funcionar. ¿Estás seguro de que no hay otra parte de la consulta que activó la excepción? Tengo varias instancias de consultas del formulario

var query = from e in db.MyTable 
      where e.AsOfDate <= DateTime.Now.Date 
      select e; 

en mi código.

+1

Esto funcionó: DONDE StartDateColumn <= GETDATE() // Hoy Esto no lo hizo: DONDE StartDateColumn. Fecha <= GETDATE() // Hoy Tenía. Fecha en mi estado de cuenta - Debo haber estado pensando en el tema. Gracias. kam –

+6

Este no es el problema - e.AsofDate.Date es el problema (comparar solo la parte de la fecha - en ambos lados ... – Dani

2

Tengo curiosidad por el mensaje de error que dice 'Date', cuando está pasando 'DateTime'. ¿Podría ser que 'StartDateColumn' es en realidad un 'Date', en lugar de 'DateTime' en la base de datos? Eso podría arruinar la comparación ...

9

Puede deberse a que la fecha en la base de datos sea nulable. Prueba esto:

var EmployeeName = 
from e in db.employee 
where e.StartDateColumn.Value <= startDT 
+1

El ".Value" fue la epifanía para mí. –

5

no puede utilizar .Date

Si desea comprobar por hoy se puede crear una fecha y hora sin tiempo

DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); 
var e = (from mds in myEntities.Table 
     where mds.CreateDateTime >= myDate 
     select mds).FirstOrDefault(); 
2

intente esto:

DateTime dd = DateTime.Parse("08/13/2010 00:00:00"); 
var data = from n in ContributionEligibilities 
      where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date 
      select n; 
data.Dump("Result") ; 
1

Estoy utilizando un LinqDataSource y tuve problemas para obtener mi consulta con una Comparación de fechas para ejecutar sin errores. La respuesta es usar la función WhereAddParameters y agregar el valor de prueba como un parámetro fuertemente tipado.

Vea el ejemplo a continuación donde estoy haciendo coincidir un groupid y verificando si StopDate en mi registro es mayor o igual a un sello de fecha/hora de ahora.

Estoy usando este fragmento de código actualmente y funciona como un encanto.

LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString()) 
LinqCampaigns.Where = "GroupId = " & myGrp & " && " & "StopDate >= @StopDate" 

Funciona como un encanto ....

1

utilizar una variable local para almacenar el valor de fecha y luego usar esa variable en la consulta:

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

8

se puede comprobar el estado como éste

var nextDay = DateTime.Today.AddDays(1); 

var query = from e in db.MyTable 
      where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
      select e; 

aquí se obtendrá los registros en fecha de AsOfDate mientras verificamos entre hoy (00:00:00) y mañana (00:00:00) obtendremos el registro de la fecha de hoy solamente cualquiera que sea el momento ...

0

.Fecha no funcionó, pero .Día hizo por mí.

var query = from o in Payments 
    where o.Order.OrderDate.Day != o.PaymentDate.Day 
    orderby o.Order.OrderDate 
    select new 
    { 
    o.Order.OrderID, 
    o.Order.OrderDate, 
    o.PaymentDate,  
    o.Order.FirstName, 
    o.Order.LastName, 
    o.Order.CustomerID 
    }; 


query.Dump(); 
+1

Esto es probablemente *** no *** lo que quieras. Simplemente obtendrá el Día del mes. Por lo tanto, Jan 01 y Feb 01 ambos tienen el mismo valor de componente 'Día', a pesar de que en realidad son días diferentes en tiempo real. – JoeBrockhaus

63

utilizar la clase DbFunctions para cortar la porción de tiempo.

using System.Data.Entity; 

var bla = (from log in context.Contacts 
      where DbFunctions.TruncateTime(log.ModifiedDate) 
           == DbFunctions.TruncateTime(today.Date) 
      select log).FirstOrDefault(); 

Fuente: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

+0

Estaba luchando con esto, decidí usar un método de extensión, solo para encontrar más adelante sobre esto -.- –

+6

Esta debería haber sido la respuesta –

+3

EntityFunctions fue obsoleta, reemplazada por DbFunctions, respuesta actualizada para reflejar esto –

0

asegurar que compruebe valor nulo como esto:

'(from mm in _db.Calls 
    where mm.Professionnal.ID.Equals(proid) 
    && mm.ComposedDate.HasValue && 
    (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date) 
    select mm).ToArray();' 
Cuestiones relacionadas