web-dev-qa-db-fra.com

Le type de membre spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, membres d'entité et propriétés de navigation d'entité

À l'aide de ce code dans Entity Framework je reçois le message d'erreur suivant. Je dois obtenir toutes les lignes pour une date spécifique, DateTimeStart est de type DataType dans ce format 2013-01-30 12:00:00.000

Code:

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

Erreur:

base {System.SystemException} = {"The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."}

Des idées comment résoudre ce problème?

116
GibboK

DateTime.Date ne peut pas être converti en SQL. Utilisez EntityFunctions.TruncateTime méthode pour obtenir un élément de date.

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

UPDATE: Comme @shankbond mentionné dans les commentaires, dans Entity Framework 6 EntityFunctions est obsolète et vous devez utiliser DbFunctions class, fourni avec Entity Framework.

228
Sergey Berezovskiy

Vous devriez maintenant utiliser DbFunctions.TruncateTime

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

Je voudrais ajouter une solution, qui m'a aidé à résoudre ce problème dans le cadre d'entité:

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

J'espère que ça aide.

13
jvrdelafuente

EntityFunctions est obsolète. Pensez à utiliser DbFunctions à la place.

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

Utilisez toujours EntityFunctions.TruncateTime () pour x.DateTimeStart et currentDate . Tels que:

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

Il suffit d'utiliser des propriétés simples.

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

Si les dates futures ne sont pas possibles dans votre application, alors > = x.DateTimeStart> = currentDateTime.Date est suffisant.

si vous avez des comparaisons de date plus complexes, vérifiez alors Fonctions canoniques Si vous avez des fonctions EF6 + DB

Plus généralement - Pour les personnes à la recherche de problèmes Les méthodes Linq prises en charge dans EF Peuvent expliquer des problèmes similaires avec les instructions linq qui fonctionnent sur les listes de bases de mémoire, mais pas dans EF. 

4
phil soady

Utilisez le code ci-dessous pour utiliser EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
1
Abdus Salam Azad

Simplifié:

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

Une autre solution pourrait être:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
0
CalinCosmin