update query framework consulta columns entity-framework linq-to-entities

entity framework - query - El miembro de tipo especificado ''Fecha'' no es compatible con LINQ para Entidades Excepción



linq entity framework c# (8)

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?


"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í:

DateTime ruleDate = Convert.ToDateTime(rule.data); DateTime startDate = SearchDate.Date; DateTime endDate = SearchDate.Date.AddDay(1); return jobdescriptions.Where(j.Deadline >= startDate && j.Deadline < endDate );

es mejor que usar partes de la fecha para. porque la consulta se ejecuta más rápido en datos de gran tamaño.


Intenta usar

return jobdescriptions.AsEnumerable() .Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );

AsEnumerable() cambia el contexto de la consulta de LINQ a Entidades a LINQ a Objetos, por lo que la condición no se convierte a SQL


LINQ to Entities no puede traducir la mayoría de los métodos de fecha .NET (incluida la conversión que utilizó) a SQL, ya que no hay 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 fecha de llamada en una propiedad DateTime tampoco se puede traducir a SQL, por lo que una solución es comparar las propiedades .Year .Month y .Day que se pueden traducir a LINQ ya que solo son enteros.

var ruleDate = Convert.ToDateTime(rule.data).Date; return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year && j.Deadline.Month == ruleDate.Month && j.Deadline.Day == ruleDate.Day);


Lo que significa es que LINQ to SQL no sabe cómo convertir la propiedad Date en una expresión SQL. Esto se debe a que la propiedad Date de la estructura DateTime no tiene ningún análogo en SQL.


Para EF6 use DbFunctions.TruncateTime (mydate) en su lugar.


Puede usar el método TruncateTime de EntityFunctions para lograr una traducción correcta de la propiedad Date en SQL:

using System.Data.Objects; // you need this namespace for EntityFunctions // ... DateTime ruleData = Convert.ToDateTime(rule.data).Date; return jobdescriptions .Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData);


Actualización: EntityFunctions está en desuso en EF6, use DbFunctions.TruncateTime


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 así que ya no debo convertir mi DateTime a Date, sino que se queda DateTime.

Si tiene solo un DateTime, también puede configurar el tiempo de inicio (con cualquier fecha) a 00:00:00 y el tiempo de finalización a 23:59:59 Luego busca como si fuera un lapso de tiempo.

var from = this.setStartTime(yourDateTime); var to = this.setEndTime(yourDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);

Tu puedes hacerlo también con DateTime-Range:

var from = this.setStartTime(yourStartDateTime); var to = this.setEndTime(yourEndDateTime); yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);


Funcionó para mí

DateTime dt = DateTime.Now.Date; var ord = db.Orders.Where (p => p.UserID == User && p.ValidityExpiry <= dt);

Fuente: Foros de Asp.net