Obtuve una excepción al implementar las siguientes declaraciones.
DateTime result;
if (!DateTime.TryParse(rule.data, out result))
return jobdescriptions;
if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
Excepción
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Sé lo que significa la excepción, pero no sé cómo deshacerme de ella. ¿Alguna ayuda?
entity-framework
linq-to-entities
nebulosa
fuente
fuente
.Date
.Respuestas:
LINQ to Entities no puede traducir la mayoría de los métodos .NET Date (incluida la conversión que utilizó) a SQL, ya que no existe un SQL equivalente.
La solución es usar los métodos Date fuera de la declaración LINQ y luego pasar un valor. Parece que Convert.ToDateTime (rule.data) .Date está causando el error.
La llamada a la fecha en una propiedad DateTime tampoco se puede traducir a SQL, por lo que una solución alternativa es comparar las propiedades .Year .Month y .Day que se pueden traducir a LINQ ya que solo son números enteros.
fuente
j.JobDeadline.Date
?Puede utilizar el método TruncateTime de EntityFunctions para lograr una traducción correcta de la
Date
propiedad en SQL:Actualización:
EntityFunctions
está en desuso en EF6, useDbFunctions.TruncateTime
fuente
ruleData
esDateTime
tipo yj.JobDeadline
tiene tiempo truncado. No se siente bien. No obtuve la excepción, pero tampoco obtuve el resultado esperado.JobDeadline
tiene la misma fecha querule.data
, sin importar la hora del día . ¿No es eso lo que quiere lograr con su consulta en la pregunta? ¿Por qué no se siente bien?EntityFunctions
está obsoleto en EF6, ahora debe usarDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxPara EF6, utilice DbFunctions.TruncateTime (mydate) en su lugar.
fuente
"EntityFunctions.TruncateTime" o "DbFunctions.TruncateTime" en ef6 está funcionando pero tiene algún problema de rendimiento en Big Data.
Creo que la mejor manera es actuar así:
es mejor que usar partes de la fecha para. porque la consulta se ejecuta más rápido en datos grandes.
fuente
EntityFunctions.TruncateTime
(luego reemplazado porDbFunctions.TruncateTime
) se implementan convirtiendo a SQL, donde la fecha y hora se convierte en una cadena y se trunca. Esto hace que la consulta se ejecute significativamente más lentamente, en proporción al número de registros procesados.Necesita incluir
using System.Data.Entity;
. Funciona bien incluso conProjectTo<>
fuente
Lo que significa es que LINQ to SQL no sabe cómo convertir la
Date
propiedad en una expresión SQL. Esto se debe a que laDate
propiedad de laDateTime
estructura no tiene analogía en SQL.fuente
Funcionó para mí.
Fuente: Foros de Asp.net
fuente
Tengo el mismo problema pero trabajo con DateTime-Ranges. Mi solución es manipular la hora de inicio (con cualquier fecha) a 00:00:00 y la hora de finalización a 23:59:59, por lo que ya no debo convertir mi DateTime a Date, sino que sigue siendo DateTime.
Si solo tiene una fecha y hora, también puede establecer la hora de inicio (con cualquier fecha) en 00:00:00 y la hora de finalización en 23:59:59. Luego, busque como si fuera un intervalo de tiempo.
También puede hacerlo con DateTime-Range:
fuente
puedes obtener Enum como:
fuente
Como muchos han señalado aquí, el uso de la función TruncateTime es lento.
Si puede, la opción más sencilla es utilizar EF Core. Puede hacer esto. Si no puede, una mejor alternativa para truncar es no cambiar el campo consultado en absoluto, sino modificar los límites. Si está haciendo una consulta normal de tipo 'entre' donde los límites inferior y superior son opcionales, lo siguiente será suficiente.
Básicamente, en lugar de recortar PoDate a solo la parte de Fecha, incrementamos el límite de consulta superior y el usuario <en lugar de <=
fuente