Il membro del tipo specificato 'Data' non è supportato in LINQ to Entities. Solo inizializzatori, membri entità e proprietà di navigazione entità


138

Utilizzando questo codice in Entity Framework ricevo il seguente errore. Ho bisogno di ottenere tutte le righe per una data specifica, DateTimeStartè di tipo DataType in questo formato2013-01-30 12:00:00.000

Codice:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Errore:

base {System.SystemException} = {"Il tipo di membro specificato 'Date' non è supportato in LINQ to Entities. Sono supportati solo inizializzatori, membri di entità e proprietà di navigazione delle entità."}

Qualche idea su come aggiustarlo?


Sono in grado di utilizzare x.DateTimeStart.Date in EF Core 2.1.1
Kirsten Greed

Risposte:


271

DateTime.Datenon può essere convertito in SQL. Utilizzare il metodo EntityFunctions.TruncateTime per ottenere la parte della data.

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

AGGIORNAMENTO: Come menzionato @shankbond nei commenti, in Entity Framework 6 EntityFunctionsè obsoleto e dovresti usare la DbFunctionsclasse, che viene fornita con Entity Framework.


1
Devo modificare leggermente la tua versione .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); fammi sapere i tuoi malviventi
GibboK

1
Spero non ti dispiaccia di aver modificato la tua risposta aggiungendo .date se sei d'accordo, quindi solo per riferimento :-) grazie per il tuo supporto, lo apprezzo molto
GibboK

1
@GibboK certo, nessun problema :) Questo era solo allo scopo di formattare una stringa lunga.
Sergey Berezovskiy,

68
EntityFunctions è obsoleto, invece usa il metodo
DbFunctions.TruncateTime

1
Il membro del tipo specificato 'Data' non è supportato in LINQ to Entities. Sono supportati solo inizializzatori, membri entità e proprietà di navigazione entità.
SAR,

84

Ora dovresti usare DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


Il membro del tipo specificato 'Data' non è supportato in LINQ to Entities. Sono supportati solo inizializzatori, membri entità e proprietà di navigazione entità.
SAR

17

Vorrei aggiungere una soluzione che mi abbia aiutato a risolvere questo problema nel framework delle entità:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Spero che sia d'aiuto.


15

EntityFunctionsè obsoleto. Prendi DbFunctionsinvece in considerazione l'utilizzo .

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

8

Utilizzare sempre EntityFunctions.TruncateTime () sia per x.DateTimeStart che per CurrentDate. ad esempio :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));

5

Usa solo proprietà semplici.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Se le date future non sono possibili nella tua app, allora > = x.DateTimeStart> = currentDateTime.Date è sufficiente.

se hai confronti di date più complessi, controlla le funzioni canoniche e se hai le funzioni EF6 + DB

Più in generale - Per le persone alla ricerca di problemi I metodi Linq supportati in EF possono spiegare problemi simili con le istruzioni linq che funzionano con gli elenchi di memorie ma non con EF.


3

semplificata:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();

2

Usa il codice seguente per usare EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Un'altra soluzione potrebbe essere:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.