Il membro del tipo specificato ‘Data’ non è supportato in LINQ to Entities Exception

Ho ottenuto un’eccezione durante l’implementazione delle seguenti dichiarazioni.

DateTime result; if (!DateTime.TryParse(rule.data, out result)) return jobdescriptions; if (result  j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date ); 

Eccezione

 The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

So cosa significa l’eccezione, ma non so come sbarazzarmene. Qualsiasi aiuto?

LINQ to Entities non è in grado di convertire la maggior parte dei metodi Data .NET (inclusa la fusione utilizzata) in SQL poiché non esiste un SQL equivalente.

La soluzione consiste nell’usare i metodi Date all’esterno dell’istruzione LINQ e quindi immettere un valore. Sembra che Convert.ToDateTime (rule.data) .Date stia causando l’errore.

Anche la Calling Date su una proprietà DateTime non può essere tradotta in SQL, quindi una soluzione alternativa consiste nel confrontare le proprietà .Year .Month e .Day che possono essere tradotte in LINQ poiché sono solo numeri interi.

 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); 

È ansible utilizzare il metodo TruncateTime di EntityFunctions per ottenere una traduzione corretta della proprietà Date in 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); 

Aggiornamento: EntityFunctions è deprecato in EF6, Usa DbFunctions.TruncateTime

Per EF6 invece usare DbFunctions.TruncateTime (mydate).

“EntityFunctions.TruncateTime” o “DbFunctions.TruncateTime” in ef6 funziona, ma ha qualche problema di prestazioni nei Big Data.

Penso che il modo migliore sia comportarsi così:

 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 ); 

è meglio che usare parti della data per. perché la query viene eseguita più velocemente nei dati di grandi dimensioni.

Prova a usare

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

AsEnumerable() cambia il contesto della query da LINQ a Entities a LINQ to Objects quindi la condizione non viene convertita in SQL

Ciò che significa è che LINQ to SQL non sa come trasformare la proprietà Date in un’espressione SQL. Questo perché la proprietà Date della struttura DateTime non ha analoghi in SQL.

Ha funzionato per me.

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

Fonte: forum di Asp.net

Ho lo stesso problema ma lavoro con i DateTime-Ranges. La mia soluzione è di manipolare l’ora di inizio (con qualsiasi data) a 00:00:00 e l’ora di fine alle 23:59:59 Quindi non devo più convertire il mio DateTime alla Data, piuttosto rimane DateTime.

Se hai un solo DateTime, puoi anche impostare l’ora di inizio (con qualsiasi data) a 00:00:00 e l’orario di fine alle 23:59:59 Quindi cerchi come se fosse un intervallo di tempo.

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

Puoi farlo anche 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);