2011-08-16 8 views
47

estoy tratando de ejecutar el siguiente código y estoy recibiendo un error'Fecha' no es compatible con LINQ para Entidades. Sólo inicializadores, miembros de la entidad, y las propiedades de navegación entidad son compatibles

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    var context = new LoggingEntities(); 
    var query = from t in context.Logs 

      where t.Title == title 
      && t.Timestamp == LogDate 

      select t; 
    return query.ToList(); 
} 

El error que estoy recibiendo es "el miembro de tipo especificado 'Fecha' es no soportado en LINQ to Entities. Solo son compatibles los inicializadores, los miembros de la entidad y las propiedades de navegación de la entidad ". He intentado varios intentos de convertir cada cosa en una cadena, solo comparando la parte de fecha, pero parece que no puedo obtener la combinación correcta. Cualquier ayuda es muy apreciada.

+1

Nos muestran la clase de registros y la mesa que está siendo asignado. – BennyM

+0

Estoy usando EFv1 con .net 3.5. La clase de registro es solo una tabla de registro de la biblioteca de empresa con el título como Tipo de cadena y Marca de tiempo como campo de fecha y hora.Solo quiero comparar el datepart – mikemurf22

Respuesta

23

No es la mejor solución, pero funciona. Por una variedad de razones, tengo que usar .net 3.5 en este punto y modificar la base de datos sería difícil. De todos modos, aquí hay una solución que funciona:

  var query = from t in context.Logs 
         where t.Title == title 
         && t.Timestamp.Day == LogDate.Day 
         && t.Timestamp.Month == LogDate.Month 
         && t.Timestamp.Year == LogDate.Year 
         select t; 

No es la solución más elegante, pero es efectiva.

+0

El miembro del tipo especificado 'Fecha' no es compatible con LINQ to Entities. Solo se admiten inicializadores, miembros de entidades y propiedades de navegación de entidades. – SAR

1

Corrígeme si me equivoco, pero en el ejemplo de mikemurf22, necesitaría verificar cada parte del componente de fecha, y potencialmente mucho más procesamiento de servidor.

De todos modos, me encontré con este problema, y ​​esta es mi solución.

Suponiendo que solo va a pasar el componente de fecha, puede encontrar el último minuto del día que ingresa y usar la cláusula where para definir el rango.

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59) 

    var query = from t in context.Logs 
       where t.Timestamp >= date 
       where t.Timestamp <= enddate 
       select t; 

    return query.ToList(); 
} 
-1

Puede utilizar este truco:

DateTime startDate = LogDate.Date; 
DateTime endDate = LogDate.Date.AddDays(1); 

var query = from t in context.Logs 
      where t.Title == title 
        && t.Timestamp >= startDate 
        && t.Timestamp < endDate 
      select t; 
+0

Lo corrigí un poco. De fuente no puede usar el método AddDays dentro de su consulta. Pero puedes moverlo afuera. Así que la solución aún funciona. – algreat

83

Si está utilizando EF 6.0 o superior, puede utilizar DbFunctions.TruncateTime(DateTime?):

var query = 
    from t in context.Logs 
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date 
    select t; 

Nota: Para la versión anterior de EF, donde DbFunctions no está disponible, EntityFunctions.TruncateTime(DateTime?) se puede utilizar en su lugar.

+0

También deberá Truncar su propiedad LogDate.Date – invalidusername

+1

@invalidusername LogDate es un DateTime que significa que LogDate.Date se "truncó" –

+3

+1 por usted, señor. No pude usar la respuesta aceptada en mi caso ya que hice una comparación "mayor que", en la que no puede comparar el día, el mes y el año por separado. –

2

Utilice siempre EntityFunctions.TruncateTime() para x.DateTimeStart y LogDate. tales como:

var query = from t in context.Logs 
       where t.Title == title 
       && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate) 
       select t; 
0

Convertir longDate a .ToShortDateString y luego se puede utilizar de esta manera:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate 

como Mike no

0

Prueba esto:

var calDate = DateTime.Now.Date.AddDays(-90); 

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate) 
Cuestiones relacionadas